forked from OSchip/llvm-project
[Sema][ObjC++] Typo correction should handle ivars and properties
After r260016 and r260017 disabled typo correction for ivars and properties clang didn't report errors about unresolved identifier in the base of ivar and property ref expressions. This meant that clang invoked CodeGen on invalid AST which then caused a crash. This commit re-enables typo correction for ivars and properites, and fixes the PR25113 & PR26486 (that were originally fixed in r260017 and r260016) in a different manner by transforming the Objective-C ivar reference expression with 'IsFreeIvar' preserved. rdar://30310772 llvm-svn: 294008
This commit is contained in:
parent
320f79c8aa
commit
776b417634
|
@ -7250,14 +7250,6 @@ public:
|
|||
|
||||
ExprResult TransformBlockExpr(BlockExpr *E) { return Owned(E); }
|
||||
|
||||
ExprResult TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
|
||||
return Owned(E);
|
||||
}
|
||||
|
||||
ExprResult TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
|
||||
return Owned(E);
|
||||
}
|
||||
|
||||
ExprResult Transform(Expr *E) {
|
||||
ExprResult Res;
|
||||
while (true) {
|
||||
|
|
|
@ -2982,16 +2982,17 @@ public:
|
|||
ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
|
||||
SourceLocation IvarLoc,
|
||||
bool IsArrow, bool IsFreeIvar) {
|
||||
// FIXME: We lose track of the IsFreeIvar bit.
|
||||
CXXScopeSpec SS;
|
||||
DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
|
||||
return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
|
||||
/*FIXME:*/IvarLoc, IsArrow,
|
||||
SS, SourceLocation(),
|
||||
/*FirstQualifierInScope=*/nullptr,
|
||||
NameInfo,
|
||||
/*TemplateArgs=*/nullptr,
|
||||
/*S=*/nullptr);
|
||||
ExprResult Result = getSema().BuildMemberReferenceExpr(
|
||||
BaseArg, BaseArg->getType(),
|
||||
/*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
|
||||
/*FirstQualifierInScope=*/nullptr, NameInfo,
|
||||
/*TemplateArgs=*/nullptr,
|
||||
/*S=*/nullptr);
|
||||
if (IsFreeIvar && Result.isUsable())
|
||||
cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
|
||||
return Result;
|
||||
}
|
||||
|
||||
/// \brief Build a new Objective-C property reference expression.
|
||||
|
|
|
@ -21,3 +21,18 @@ public:
|
|||
self.m_prop2 = new ClassB(m_prop1); // expected-error {{use of undeclared identifier 'm_prop1'; did you mean '_m_prop1'?}}
|
||||
}
|
||||
@end
|
||||
|
||||
// rdar://30310772
|
||||
|
||||
@interface InvalidNameInIvarAndPropertyBase
|
||||
{
|
||||
@public
|
||||
float _a;
|
||||
}
|
||||
@property float _b;
|
||||
@end
|
||||
|
||||
void invalidNameInIvarAndPropertyBase() {
|
||||
float a = ((InvalidNameInIvarAndPropertyBase*)node)->_a; // expected-error {{use of undeclared identifier 'node'}}
|
||||
float b = ((InvalidNameInIvarAndPropertyBase*)node)._b; // expected-error {{use of undeclared identifier 'node'}}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue