diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-04-20 18:19:55 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-04-20 18:19:55 +0000 |
commit | 109ec1b05664e35e710785314c12552307f39a7d (patch) | |
tree | ed96e77548682b4b209592771631999e9f955401 | |
parent | 22ce41d9fc8509da65858c75bf5b3c4dae2d8c04 (diff) |
Fix a crash-on-invalid involving non-identifier names in a member
access expression that appears to be a property reference. Fixes
<rdar://problem/8985943>.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@129865 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Basic/DiagnosticSemaKinds.td | 2 | ||||
-rw-r--r-- | lib/Sema/SemaExprObjC.cpp | 7 | ||||
-rw-r--r-- | test/SemaObjCXX/propert-dot-error.mm | 10 |
3 files changed, 19 insertions, 0 deletions
diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index ce592a3c95..b72ef6fed5 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -2724,6 +2724,8 @@ def err_ref_array_type : Error< "cannot refer to declaration with an array type inside block">; def err_property_not_found : Error< "property %0 not found on object of type %1">; +def err_invalid_property_name : Error< + "%0 is not a valid property name (accessing an object of type %1)">; def err_getter_not_found : Error< "expected getter method not found on object of type %0">; def err_property_not_found_forward_class : Error< diff --git a/lib/Sema/SemaExprObjC.cpp b/lib/Sema/SemaExprObjC.cpp index cacc846028..04f5e32bda 100644 --- a/lib/Sema/SemaExprObjC.cpp +++ b/lib/Sema/SemaExprObjC.cpp @@ -426,6 +426,13 @@ HandleExprPropertyRefExpr(const ObjCObjectPointerType *OPT, bool Super) { const ObjCInterfaceType *IFaceT = OPT->getInterfaceType(); ObjCInterfaceDecl *IFace = IFaceT->getDecl(); + + if (MemberName.getNameKind() != DeclarationName::Identifier) { + Diag(MemberLoc, diag::err_invalid_property_name) + << MemberName << QualType(OPT, 0); + return ExprError(); + } + IdentifierInfo *Member = MemberName.getAsIdentifierInfo(); if (IFace->isForwardDecl()) { diff --git a/test/SemaObjCXX/propert-dot-error.mm b/test/SemaObjCXX/propert-dot-error.mm index 47b7dc64d5..aeb8f3068e 100644 --- a/test/SemaObjCXX/propert-dot-error.mm +++ b/test/SemaObjCXX/propert-dot-error.mm @@ -39,3 +39,13 @@ void g(B *b) { b.value.staticData = 17; b.value.method(); } + +@interface C +@end + +@implementation C +- (void)method:(B *)b { + // <rdar://problem/8985943> + b.operator+ = 17; // expected-error{{'operator+' is not a valid property name (accessing an object of type 'B *')}} +} +@end |