aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2009-12-16 18:03:30 +0000
committerFariborz Jahanian <fjahanian@apple.com>2009-12-16 18:03:30 +0000
commitdd69aae2851577e4266b62f3430a1fce757b65ae (patch)
treefa94476a4e607c67d85319b4753c26cc8029b7eb
parent4b3e5be334c93c3f48af2a49c0ea7cd9bae2a0e5 (diff)
Diagnose property of reference type as unsupported
instead of crashing for now. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91546 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/Basic/DiagnosticSemaKinds.td2
-rw-r--r--lib/Sema/SemaDeclObjC.cpp4
-rw-r--r--test/SemaObjCXX/references.mm9
3 files changed, 9 insertions, 6 deletions
diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td
index 37d80e15e4..2c3f85f2be 100644
--- a/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/include/clang/Basic/DiagnosticSemaKinds.td
@@ -305,6 +305,8 @@ def note_property_declare : Note<
"property declared here">;
def error_synthesize_category_decl : Error<
"@synthesize not allowed in a category's implementation">;
+def error_reference_property : Error<
+ "property of reference type is not supported">;
def error_missing_property_interface : Error<
"property implementation in a category with no category declaration">;
def error_bad_category_property_decl : Error<
diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp
index a768e1bdf7..ea7d9a9385 100644
--- a/lib/Sema/SemaDeclObjC.cpp
+++ b/lib/Sema/SemaDeclObjC.cpp
@@ -1950,6 +1950,10 @@ Sema::DeclPtrTy Sema::ActOnProperty(Scope *S, SourceLocation AtLoc,
!(Attributes & ObjCDeclSpec::DQ_PR_retain) &&
!(Attributes & ObjCDeclSpec::DQ_PR_copy)));
QualType T = GetTypeForDeclarator(FD.D, S);
+ if (T->isReferenceType()) {
+ Diag(AtLoc, diag::error_reference_property);
+ return DeclPtrTy();
+ }
Decl *ClassDecl = ClassCategory.getAs<Decl>();
ObjCInterfaceDecl *CCPrimary = 0; // continuation class's primary class
// May modify Attributes.
diff --git a/test/SemaObjCXX/references.mm b/test/SemaObjCXX/references.mm
index ded385cba1..70ce8278e8 100644
--- a/test/SemaObjCXX/references.mm
+++ b/test/SemaObjCXX/references.mm
@@ -1,7 +1,4 @@
-// FIXME: This crashes, disable it until fixed.
-// RN: %clang_cc1 -verify -emit-llvm -o - %s
-// RUN: false
-// XFAIL: *
+// RUN: %clang_cc1 -verify -emit-llvm -o - %s
// Test reference binding.
@@ -12,7 +9,7 @@ typedef struct {
@interface A
@property (assign) T p0;
-@property (assign) T& p1;
+@property (assign) T& p1; // expected-error {{property of reference type is not supported}}
@end
int f0(const T& t) {
@@ -24,6 +21,6 @@ int f1(A *a) {
}
int f2(A *a) {
- return f0(a.p1);
+ return f0(a.p1); // expected-error {{property 'p1' not found on object of type 'A *'}}
}