From ec385cf3c73434e42d03c321b05100ca64e0c90d Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Mon, 25 Apr 2011 15:05:41 +0000 Subject: [PATCH] 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 --- lib/Parse/ParseStmt.cpp | 1 - lib/Sema/SemaDecl.cpp | 14 +++----------- 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