From 8df7a28269a1c0f4444928d0baea402b410e95f1 Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Tue, 2 Jun 2009 18:32:00 +0000 Subject: [PATCH] Issue diagnostics on __weak attribute mismatch. Fixes an error recovery issue which caused a crash. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72733 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AST/ASTContext.cpp | 37 +++++++++++++++----- test/SemaObjC/objc2-merge-gc-attribue-decl.m | 6 ++++ 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 29bca29f23..017d09d265 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -2785,7 +2785,7 @@ QualType::GCAttrTypes ASTContext::getObjCGCAttrKind(const QualType &Ty) const { } // Non-pointers have none gc'able attribute regardless of the attribute // set on them. - else if (!isObjCObjectPointerType(Ty) && !Ty->isPointerType()) + else if (!Ty->isPointerType() && !isObjCObjectPointerType(Ty)) return QualType::GCNone; } return GCAttrs; @@ -3033,26 +3033,45 @@ QualType ASTContext::mergeTypes(QualType LHS, QualType RHS) { if (RHSClass == Type::ExtQual) { QualType::GCAttrTypes GCAttr = RHSCan.getObjCGCAttr(); if (GCAttr != QualType::GCNone) { + // __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) + return QualType(); + RHS = QualType(cast(RHS.getDesugaredType())->getBaseType(), RHS.getCVRQualifiers()); QualType Result = mergeTypes(LHS, RHS); - if (Result.getObjCGCAttr() == QualType::GCNone) - Result = getObjCGCQualType(Result, GCAttr); - else if (Result.getObjCGCAttr() != GCAttr) - Result = QualType(); + if (!Result.isNull()) { + if (Result.getObjCGCAttr() == QualType::GCNone) + Result = getObjCGCQualType(Result, GCAttr); + else if (Result.getObjCGCAttr() != GCAttr) + Result = QualType(); + } return Result; } } if (LHSClass == Type::ExtQual) { QualType::GCAttrTypes GCAttr = LHSCan.getObjCGCAttr(); 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) + return QualType(); LHS = QualType(cast(LHS.getDesugaredType())->getBaseType(), LHS.getCVRQualifiers()); QualType Result = mergeTypes(LHS, RHS); - if (Result.getObjCGCAttr() == QualType::GCNone) - Result = getObjCGCQualType(Result, GCAttr); - else if (Result.getObjCGCAttr() != GCAttr) - Result = QualType(); + if (!Result.isNull()) { + if (Result.getObjCGCAttr() == QualType::GCNone) + Result = getObjCGCQualType(Result, GCAttr); + else if (Result.getObjCGCAttr() != GCAttr) + Result = QualType(); + } return Result; } } diff --git a/test/SemaObjC/objc2-merge-gc-attribue-decl.m b/test/SemaObjC/objc2-merge-gc-attribue-decl.m index 4e3b3ec7a4..080f96c7fd 100644 --- a/test/SemaObjC/objc2-merge-gc-attribue-decl.m +++ b/test/SemaObjC/objc2-merge-gc-attribue-decl.m @@ -10,3 +10,9 @@ extern id p1; extern id CFRunLoopGetMain(); extern __strong id CFRunLoopGetMain(); +extern __weak id WLoopGetMain(); // expected-note {{previous declaration is here}} +extern id WLoopGetMain(); // expected-error {{conflicting types for 'WLoopGetMain'}} + +extern id p3; // expected-note {{previous definition is here}} +extern __weak id p3; // expected-error {{redefinition of 'p3' with a different type}} + -- 2.40.0