From 86f4385536a0b2202860ad4e20d84f9330b1a4f4 Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Tue, 2 Jun 2009 20:58:58 +0000 Subject: [PATCH] Diagnose misuse of __strong attribute in a redeclaration. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72737 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AST/ASTContext.cpp | 25 +++++++++++++------- test/SemaObjC/objc2-merge-gc-attribue-decl.m | 12 ++++++++++ 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 017d09d265..3b405267e8 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -3033,13 +3033,15 @@ QualType ASTContext::mergeTypes(QualType LHS, QualType RHS) { if (RHSClass == Type::ExtQual) { QualType::GCAttrTypes GCAttr = RHSCan.getObjCGCAttr(); if (GCAttr != QualType::GCNone) { + QualType::GCAttrTypes GCLHSAttr = LHSCan.getObjCGCAttr(); // __weak attribute must appear on both declarations. - // FIXME. __strong attribue is redundant if other decl is an objective-c - // object pointer (or decorated with __strong attribute). We can't issue - // diagnostic on __strong mismatch becuase 'id' may not be - // available but only with its canonical type at this point. Will - // visit this when 'id' becomes a concrete type. - if (GCAttr == QualType::Weak && LHSCan.getObjCGCAttr() != GCAttr) + // __strong attribue is redundant if other decl is an objective-c + // object pointer (or decorated with __strong attribute); otherwise + // issue error. + if ((GCAttr == QualType::Weak && GCLHSAttr != GCAttr) || + (GCAttr == QualType::Strong && GCLHSAttr != GCAttr && + LHSCan->isPointerType() && !isObjCObjectPointerType(LHSCan) && + !isObjCIdStructType(LHSCan->getAsPointerType()->getPointeeType()))) return QualType(); RHS = QualType(cast(RHS.getDesugaredType())->getBaseType(), @@ -3059,10 +3061,15 @@ QualType ASTContext::mergeTypes(QualType LHS, QualType RHS) { if (GCAttr != QualType::GCNone) { QualType::GCAttrTypes GCRHSAttr = RHSCan.getObjCGCAttr(); // __weak attribute must appear on both declarations. __strong - // attribue is redundant if other decl is an objective-c object pointer. - // See above FIXME comment. - if (GCAttr == QualType::Weak && GCRHSAttr != GCAttr) + // __strong attribue is redundant if other decl is an objective-c + // object pointer (or decorated with __strong attribute); otherwise + // issue error. + if ((GCAttr == QualType::Weak && GCRHSAttr != GCAttr) || + (GCAttr == QualType::Strong && GCRHSAttr != GCAttr && + RHSCan->isPointerType() && !isObjCObjectPointerType(RHSCan) && + !isObjCIdStructType(RHSCan->getAsPointerType()->getPointeeType()))) return QualType(); + LHS = QualType(cast(LHS.getDesugaredType())->getBaseType(), LHS.getCVRQualifiers()); QualType Result = mergeTypes(LHS, RHS); diff --git a/test/SemaObjC/objc2-merge-gc-attribue-decl.m b/test/SemaObjC/objc2-merge-gc-attribue-decl.m index 080f96c7fd..9dae1efdcd 100644 --- a/test/SemaObjC/objc2-merge-gc-attribue-decl.m +++ b/test/SemaObjC/objc2-merge-gc-attribue-decl.m @@ -16,3 +16,15 @@ extern id WLoopGetMain(); // expected-error {{conflicting types for 'WLoopGetMai extern id p3; // expected-note {{previous definition is here}} extern __weak id p3; // expected-error {{redefinition of 'p3' with a different type}} +extern void *p4; // expected-note {{previous definition is here}} +extern void * __strong p4; // expected-error {{redefinition of 'p4' with a different type}} + +extern id p5; +extern __strong id p5; + +extern char* __strong p6; // expected-note {{previous definition is here}} +extern char* p6; // expected-error {{redefinition of 'p6' with a different type}} + +// FIXME. We do not issue error here because we don't put the attribute on the pointer type. +extern __strong char* p7; +extern char* p7; -- 2.40.0