aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2008-12-19 17:27:57 +0000
committerAnders Carlsson <andersca@mac.com>2008-12-19 17:27:57 +0000
commit00165a25a9ac005aa2e6b4ac791d555226fa9a9f (patch)
treed7da2c030995e6628ba1b77e0199026801e1ea63
parent19bdedb4a469f67f9f321a45a48039b0c00fa4d0 (diff)
Fix for PR3234
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61245 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/Basic/DiagnosticKinds.def2
-rw-r--r--lib/Sema/SemaExpr.cpp6
-rw-r--r--test/SemaObjC/property-missing.m22
3 files changed, 30 insertions, 0 deletions
diff --git a/include/clang/Basic/DiagnosticKinds.def b/include/clang/Basic/DiagnosticKinds.def
index 39464efd6a..6b11d31701 100644
--- a/include/clang/Basic/DiagnosticKinds.def
+++ b/include/clang/Basic/DiagnosticKinds.def
@@ -458,6 +458,8 @@ DIAG(err_objc_property_requires_object, ERROR,
"property with '%0' attribute must be of object type")
DIAG(err_property_type, ERROR,
"property cannot have array or function type %0")
+DIAG(err_property_not_found, ERROR,
+ "property %0 not found on object of type %1")
DIAG(err_objc_directive_only_in_protocol, ERROR,
"directive may only be specified in protocols only")
DIAG(err_missing_catch_finally, ERROR,
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 3ee601faca..d31855e36b 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -1348,6 +1348,9 @@ ActOnMemberReferenceExpr(ExprTy *Base, SourceLocation OpLoc,
return new ObjCKVCRefExpr(Getter, Getter->getResultType(), Setter,
MemberLoc, BaseExpr);
}
+
+ return Diag(MemberLoc, diag::err_property_not_found) <<
+ &Member << BaseType;
}
// Handle properties on qualified "id" protocols.
const ObjCQualifiedIdType *QIdTy;
@@ -1364,6 +1367,9 @@ ActOnMemberReferenceExpr(ExprTy *Base, SourceLocation OpLoc,
OpLoc, MemberLoc, NULL, 0);
}
}
+
+ return Diag(MemberLoc, diag::err_property_not_found) <<
+ &Member << BaseType;
}
// Handle 'field access' to vectors, such as 'V.xx'.
if (BaseType->isExtVectorType() && OpKind == tok::period) {
diff --git a/test/SemaObjC/property-missing.m b/test/SemaObjC/property-missing.m
new file mode 100644
index 0000000000..23af00646a
--- /dev/null
+++ b/test/SemaObjC/property-missing.m
@@ -0,0 +1,22 @@
+// RUN: clang -fsyntax-only -verify %s
+
+// PR3234
+
+@protocol NSCopying @end
+@interface NSObject @end
+
+void f1(NSObject *o)
+{
+ o.foo; // expected-error{{property 'foo' not found on object of type 'NSObject *'}}
+}
+
+void f2(id<NSCopying> o)
+{
+ o.foo; // expected-error{{property 'foo' not found on object of type 'id<NSCopying>'}}
+}
+
+void f3(id o)
+{
+ o.foo; // expected-error{{member reference base type 'id' is not a structure or union}}
+}
+