From 109ec1b05664e35e710785314c12552307f39a7d Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Wed, 20 Apr 2011 18:19:55 +0000 Subject: [PATCH] Fix a crash-on-invalid involving non-identifier names in a member access expression that appears to be a property reference. Fixes . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@129865 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/DiagnosticSemaKinds.td | 2 ++ lib/Sema/SemaExprObjC.cpp | 7 +++++++ test/SemaObjCXX/propert-dot-error.mm | 10 ++++++++++ 3 files changed, 19 insertions(+) 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 { + // + b.operator+ = 17; // expected-error{{'operator+' is not a valid property name (accessing an object of type 'B *')}} +} +@end -- 2.40.0