super and class property reference expressions don't need to be

rebuilt. Fixes <rdar://problem/11052352>. 

llvm-svn: 154667
This commit is contained in:
Douglas Gregor 2012-04-13 15:53:08 +00:00
parent 20735d2df8
commit eba02fecdd
2 changed files with 22 additions and 2 deletions

View File

@ -1300,8 +1300,13 @@ static Expr *stripOpaqueValuesFromPseudoObjectRef(Sema &S, Expr *E) {
Expr *opaqueRef = E->IgnoreParens();
if (ObjCPropertyRefExpr *refExpr
= dyn_cast<ObjCPropertyRefExpr>(opaqueRef)) {
OpaqueValueExpr *baseOVE = cast<OpaqueValueExpr>(refExpr->getBase());
return ObjCPropertyRefRebuilder(S, baseOVE->getSourceExpr()).rebuild(E);
if (refExpr->isObjectReceiver()) {
OpaqueValueExpr *baseOVE = cast<OpaqueValueExpr>(refExpr->getBase());
return ObjCPropertyRefRebuilder(S, baseOVE->getSourceExpr()).rebuild(E);
}
// Neither class or super property references need a rebuild.
return E;
} else if (ObjCSubscriptRefExpr *refExpr
= dyn_cast<ObjCSubscriptRefExpr>(opaqueRef)) {
OpaqueValueExpr *baseOVE = cast<OpaqueValueExpr>(refExpr->getBaseExpr());

View File

@ -42,3 +42,18 @@ typedef const TCPPObject& CREF_TCPPObject;
cppObjectNonAtomic = cppObject;
}
@end
// <rdar://problem/11052352>
@interface NSObject
+ alloc;
- init;
- class;
@end
template<typename T> void f() {
NSObject *o = [NSObject.alloc init];
[o class];
}
template void f<int>();