diff options
-rw-r--r-- | include/clang/Basic/DiagnosticSemaKinds.td | 2 | ||||
-rw-r--r-- | lib/Sema/SemaDeclObjC.cpp | 4 | ||||
-rw-r--r-- | test/SemaObjCXX/references.mm | 9 |
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 *'}} } |