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
This commit is contained in:
Douglas Gregor 2011-04-25 15:05:41 +00:00
Родитель 81542fd91b
Коммит ec385cf3c7
3 изменённых файлов: 15 добавлений и 12 удалений

Просмотреть файл

@ -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();

Просмотреть файл

@ -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;
}
}

Просмотреть файл

@ -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