summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-04-25 15:05:41 +0000
committerDouglas Gregor <dgregor@apple.com>2011-04-25 15:05:41 +0000
commitb90f5185b63ac387e35ba8321a145b137fd4c649 (patch)
tree99047a48fa2a1bae8925036783f251fa40a53e41
parentba446cc12ad3f8129fe76684ac52af01b281c5ff (diff)
downloadbcm5719-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.cpp1
-rw-r--r--clang/lib/Sema/SemaDecl.cpp14
-rw-r--r--clang/test/SemaObjC/ivar-lookup.m12
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
OpenPOWER on IntegriCloud