]> granicus.if.org Git - clang/commitdiff
Fix a crash-on-invalid involving non-identifier names in a member
authorDouglas Gregor <dgregor@apple.com>
Wed, 20 Apr 2011 18:19:55 +0000 (18:19 +0000)
committerDouglas Gregor <dgregor@apple.com>
Wed, 20 Apr 2011 18:19:55 +0000 (18:19 +0000)
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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaExprObjC.cpp
test/SemaObjCXX/propert-dot-error.mm

index ce592a3c953d2ccfea962dd91115475d4fb48e37..b72ef6fed55bb74601866a8906bd23a359c287ec 100644 (file)
@@ -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<
index cacc846028a53b6a6dd341678571bf95b1657c17..04f5e32bda703d2868ed763290ca5fabd9c801f3 100644 (file)
@@ -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()) {
index 47b7dc64d5cc1e26020a71105fbd98b178bf164b..aeb8f3068e223ec20c676c145a67bb5aa5bc63e9 100644 (file)
@@ -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