From acdc33b1ff74744e05d492a05053cdc4f4131086 Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Mon, 19 Jan 2009 20:13:47 +0000 Subject: [PATCH] Type of property and its ivar is more restrictive that rules for assignment. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62524 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaDeclObjC.cpp | 15 +++++++++++++++ test/SemaObjC/property-ivar-mismatch.m | 14 ++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 test/SemaObjC/property-ivar-mismatch.m diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index d140b908a8..c4fccc7671 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -1698,6 +1698,21 @@ Sema::DeclTy *Sema::ActOnPropertyImplDecl(SourceLocation AtLoc, << property->getDeclName() << Ivar->getDeclName(); return 0; } + else { + // FIXME! Rules for properties are somewhat different that those + // for assignments. Use a new routine to consolidate all cases; + // specifically for property redeclarations as well as for ivars. + QualType lhsType = + Context.getCanonicalType(PropType).getUnqualifiedType(); + QualType rhsType = + Context.getCanonicalType(IvarType).getUnqualifiedType(); + if (lhsType != rhsType && + lhsType->isArithmeticType()) { + Diag(PropertyLoc, diag::error_property_ivar_type) + << property->getDeclName() << Ivar->getDeclName(); + return 0; + } + } } } else if (PropertyIvar) { // @dynamic diff --git a/test/SemaObjC/property-ivar-mismatch.m b/test/SemaObjC/property-ivar-mismatch.m new file mode 100644 index 0000000000..a0bc929c46 --- /dev/null +++ b/test/SemaObjC/property-ivar-mismatch.m @@ -0,0 +1,14 @@ +// RUN: clang -fsyntax-only -verify %s +// Test that arithmatic types on property and its ivar have exact match. + +@interface Test4 +{ + char ivar; +} +@property int prop; +@end + +@implementation Test4 +@synthesize prop = ivar; // expected-error {{type of property 'prop' does not match type of ivar 'ivar'}} +@end + -- 2.40.0