diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-04-25 15:05:41 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-04-25 15:05:41 +0000 |
commit | ec385cf3c73434e42d03c321b05100ca64e0c90d (patch) | |
tree | f09bdb9288d900feaba11e5056cce87fd8908f14 | |
parent | 81542fd91bd5e7e65ebae3eaad117bdaeaf7d737 (diff) |
When Sema::ClassifyName() finds an invalid ivar reference, return an
invalid expression rather than the far-more-generic "error". Fixes a
mild regression in error recovery uncovered by the GCC testsuite.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@130128 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Parse/ParseStmt.cpp | 1 | ||||
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 14 | ||||
-rw-r--r-- | test/SemaObjC/ivar-lookup.m | 12 |
3 files changed, 15 insertions, 12 deletions
diff --git a/lib/Parse/ParseStmt.cpp b/lib/Parse/ParseStmt.cpp index 8a03864ad6..a324bdc045 100644 --- a/lib/Parse/ParseStmt.cpp +++ b/lib/Parse/ParseStmt.cpp @@ -148,7 +148,6 @@ Retry: break; case Sema::NC_Type: - // We have a type. // We have a type. In C, this means that we have a declaration. if (!getLang().CPlusPlus) { ParsedType Type = Classification.getType(); diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 05a077b38f..d07bd4b72d 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -411,11 +411,7 @@ Sema::NameClassification Sema::ClassifyName(Scope *S, // unqualified lookup mechanism. if (!SS.isSet() && CurMethod && !isResultTypeOrTemplate(Result, NextToken)) { ExprResult E = LookupInObjCMethod(Result, S, Name, true); - - if (E.isInvalid()) - return NameClassification::Error(); - - if (E.get()) + if (E.get() || E.isInvalid()) return E; // Synthesize ivars lazily. @@ -430,12 +426,8 @@ Sema::NameClassification Sema::ClassifyName(Scope *S, // FIXME: This is strange. Shouldn't we just take the ivar returned // from SynthesizeProvisionalIvar and continue with that? - E = LookupInObjCMethod(Result, S, Name, true); - - if (E.isInvalid()) - return NameClassification::Error(); - - if (E.get()) + E = LookupInObjCMethod(Result, S, Name, true); + if (E.get() || E.isInvalid()) return E; } } diff --git a/test/SemaObjC/ivar-lookup.m b/test/SemaObjC/ivar-lookup.m index 06e47116f7..2b14bff85d 100644 --- a/test/SemaObjC/ivar-lookup.m +++ b/test/SemaObjC/ivar-lookup.m @@ -35,3 +35,15 @@ extern struct foo x; } @end +@interface TwoIvars { + int a; + int b; +} +@end + +@implementation TwoIvars ++ (int)classMethod { + return a + b; // expected-error{{instance variable 'a' accessed in class method}} \ + // expected-error{{instance variable 'b' accessed in class method}} +} +@end |