diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp index d140b908a800..c4fccc7671aa 100644 --- a/clang/lib/Sema/SemaDeclObjC.cpp +++ b/clang/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/clang/test/SemaObjC/property-ivar-mismatch.m b/clang/test/SemaObjC/property-ivar-mismatch.m new file mode 100644 index 000000000000..a0bc929c46b5 --- /dev/null +++ b/clang/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 +