]> granicus.if.org Git - clang/commitdiff
Diagnose misuse of __strong attribute in a redeclaration.
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 2 Jun 2009 20:58:58 +0000 (20:58 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 2 Jun 2009 20:58:58 +0000 (20:58 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72737 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ASTContext.cpp
test/SemaObjC/objc2-merge-gc-attribue-decl.m

index 017d09d265a623b752fe891c9972899ab7c3a5ad..3b405267e8de72d0dffd601861adc64f20e12147 100644 (file)
@@ -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<ExtQualType>(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<ExtQualType>(LHS.getDesugaredType())->getBaseType(),
                      LHS.getCVRQualifiers());
       QualType Result = mergeTypes(LHS, RHS);
index 080f96c7fd81856797f7b0c6f133209b0006ae6f..9dae1efdcd2a88ea5ae03b8081633599fd5b8437 100644 (file)
@@ -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;