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 | b90f5185b63ac387e35ba8321a145b137fd4c649 (patch) | |
| tree | 99047a48fa2a1bae8925036783f251fa40a53e41 | |
| parent | ba446cc12ad3f8129fe76684ac52af01b281c5ff (diff) | |
| download | bcm5719-llvm-b90f5185b63ac387e35ba8321a145b137fd4c649.tar.gz bcm5719-llvm-b90f5185b63ac387e35ba8321a145b137fd4c649.zip | |
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.
llvm-svn: 130128
| -rw-r--r-- | clang/lib/Parse/ParseStmt.cpp | 1 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 14 | ||||
| -rw-r--r-- | clang/test/SemaObjC/ivar-lookup.m | 12 |
3 files changed, 15 insertions, 12 deletions
diff --git a/clang/lib/Parse/ParseStmt.cpp b/clang/lib/Parse/ParseStmt.cpp index 8a03864ad6a..a324bdc0455 100644 --- a/clang/lib/Parse/ParseStmt.cpp +++ b/clang/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/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 05a077b38fc..d07bd4b72d3 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/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/clang/test/SemaObjC/ivar-lookup.m b/clang/test/SemaObjC/ivar-lookup.m index 06e47116f73..2b14bff85d8 100644 --- a/clang/test/SemaObjC/ivar-lookup.m +++ b/clang/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 |

