Hello, it seems this broke building some iOS programs. $ cat test.m # define UI_APPEARANCE_SELECTOR __attribute__((annotate("ui_appearance_selector")))
@class UIColor; @interface Test @property(null_resettable, nonatomic, strong) UIColor *onTintColor UI_APPEARANCE_SELECTOR; @end @implementation Test - (void)setOnTintColor:(nullable UIColor *)onTintColor { } @end $ out/gn/bin/clang -c test.m -Wno-objc-root-class test.m:10:44: error: nullability specifier 'nullable' conflicts with existing specifier '_Null_unspecified' - (void)setOnTintColor:(nullable UIColor *)onTintColor { ^ 1 error generated. Before this change, that compiled fine. Surprisingly, it still builds fine if UI_APPEARANCE_SELECTOR is replaced by `__attribute__((annotate("ui_appearance_selector")))` in the source code, even though both lead to the same -E output. *From: *Leonard Chan via cfe-commits <cfe-commits@lists.llvm.org> *Date: *Mon, May 6, 2019 at 11:17 PM *To: * <cfe-commits@lists.llvm.org> Author: leonardchan > Date: Mon May 6 20:20:17 2019 > New Revision: 360109 > > URL: http://llvm.org/viewvc/llvm-project?rev=360109&view=rev > Log: > Recommit r359859 "[Attribute/Diagnostics] Print macro if definition is an > attribute declaration" > > Updated with fix for read of uninitialized memory. > > Added: > cfe/trunk/test/Frontend/macro_defined_type.cpp > cfe/trunk/test/Sema/address_space_print_macro.c > Modified: > cfe/trunk/include/clang/AST/ASTContext.h > cfe/trunk/include/clang/AST/RecursiveASTVisitor.h > cfe/trunk/include/clang/AST/Type.h > cfe/trunk/include/clang/AST/TypeLoc.h > cfe/trunk/include/clang/AST/TypeNodes.def > cfe/trunk/include/clang/Parse/Parser.h > cfe/trunk/include/clang/Sema/ParsedAttr.h > cfe/trunk/include/clang/Sema/Sema.h > cfe/trunk/include/clang/Serialization/ASTBitCodes.h > cfe/trunk/lib/ARCMigrate/TransGCAttrs.cpp > cfe/trunk/lib/AST/ASTContext.cpp > cfe/trunk/lib/AST/ASTDiagnostic.cpp > cfe/trunk/lib/AST/ASTStructuralEquivalence.cpp > cfe/trunk/lib/AST/ItaniumMangle.cpp > cfe/trunk/lib/AST/Type.cpp > cfe/trunk/lib/AST/TypePrinter.cpp > cfe/trunk/lib/CodeGen/CGDebugInfo.cpp > cfe/trunk/lib/CodeGen/CodeGenFunction.cpp > cfe/trunk/lib/Parse/ParseDecl.cpp > cfe/trunk/lib/Sema/SemaExpr.cpp > cfe/trunk/lib/Sema/SemaStmt.cpp > cfe/trunk/lib/Sema/SemaType.cpp > cfe/trunk/lib/Sema/TreeTransform.h > cfe/trunk/lib/Serialization/ASTReader.cpp > cfe/trunk/lib/Serialization/ASTWriter.cpp > cfe/trunk/test/Sema/address_spaces.c > cfe/trunk/test/SemaObjC/externally-retained.m > cfe/trunk/test/SemaObjC/gc-attributes.m > cfe/trunk/test/SemaObjC/mrc-weak.m > cfe/trunk/test/SemaObjCXX/gc-attributes.mm > cfe/trunk/tools/libclang/CIndex.cpp > > Modified: cfe/trunk/include/clang/AST/ASTContext.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ASTContext.h?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/AST/ASTContext.h (original) > +++ cfe/trunk/include/clang/AST/ASTContext.h Mon May 6 20:20:17 2019 > @@ -1441,6 +1441,9 @@ public: > > QualType getParenType(QualType NamedType) const; > > + QualType getMacroQualifiedType(QualType UnderlyingTy, > + const IdentifierInfo *MacroII) const; > + > QualType getElaboratedType(ElaboratedTypeKeyword Keyword, > NestedNameSpecifier *NNS, QualType NamedType, > TagDecl *OwnedTagDecl = nullptr) const; > > Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/AST/RecursiveASTVisitor.h (original) > +++ cfe/trunk/include/clang/AST/RecursiveASTVisitor.h Mon May 6 20:20:17 > 2019 > @@ -1065,6 +1065,9 @@ DEF_TRAVERSE_TYPE(AttributedType, > > DEF_TRAVERSE_TYPE(ParenType, { TRY_TO(TraverseType(T->getInnerType())); }) > > +DEF_TRAVERSE_TYPE(MacroQualifiedType, > + { TRY_TO(TraverseType(T->getUnderlyingType())); }) > + > DEF_TRAVERSE_TYPE(ElaboratedType, { > if (T->getQualifier()) { > TRY_TO(TraverseNestedNameSpecifier(T->getQualifier())); > @@ -1308,6 +1311,9 @@ DEF_TRAVERSE_TYPELOC(InjectedClassNameTy > > DEF_TRAVERSE_TYPELOC(ParenType, { > TRY_TO(TraverseTypeLoc(TL.getInnerLoc())); }) > > +DEF_TRAVERSE_TYPELOC(MacroQualifiedType, > + { TRY_TO(TraverseTypeLoc(TL.getInnerLoc())); }) > + > DEF_TRAVERSE_TYPELOC(AttributedType, > { TRY_TO(TraverseTypeLoc(TL.getModifiedLoc())); }) > > > Modified: cfe/trunk/include/clang/AST/Type.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Type.h?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/AST/Type.h (original) > +++ cfe/trunk/include/clang/AST/Type.h Mon May 6 20:20:17 2019 > @@ -4184,6 +4184,41 @@ public: > static bool classof(const Type *T) { return T->getTypeClass() == > Typedef; } > }; > > +/// Sugar type that represents a type that was qualified by a qualifier > written > +/// as a macro invocation. > +class MacroQualifiedType : public Type { > + friend class ASTContext; // ASTContext creates these. > + > + QualType UnderlyingTy; > + const IdentifierInfo *MacroII; > + > + MacroQualifiedType(QualType UnderlyingTy, QualType CanonTy, > + const IdentifierInfo *MacroII) > + : Type(MacroQualified, CanonTy, UnderlyingTy->isDependentType(), > + UnderlyingTy->isInstantiationDependentType(), > + UnderlyingTy->isVariablyModifiedType(), > + UnderlyingTy->containsUnexpandedParameterPack()), > + UnderlyingTy(UnderlyingTy), MacroII(MacroII) { > + assert(isa<AttributedType>(UnderlyingTy) && > + "Expected a macro qualified type to only wrap attributed > types."); > + } > + > +public: > + const IdentifierInfo *getMacroIdentifier() const { return MacroII; } > + QualType getUnderlyingType() const { return UnderlyingTy; } > + > + /// Return this attributed type's modified type with no qualifiers > attached to > + /// it. > + QualType getModifiedType() const; > + > + bool isSugared() const { return true; } > + QualType desugar() const; > + > + static bool classof(const Type *T) { > + return T->getTypeClass() == MacroQualified; > + } > +}; > + > /// Represents a `typeof` (or __typeof__) expression (a GCC extension). > class TypeOfExprType : public Type { > Expr *TOExpr; > @@ -6805,6 +6840,8 @@ template <typename T> const T *Type::get > Ty = P->desugar().getTypePtr(); > else if (const auto *A = dyn_cast<AdjustedType>(Ty)) > Ty = A->desugar().getTypePtr(); > + else if (const auto *M = dyn_cast<MacroQualifiedType>(Ty)) > + Ty = M->desugar().getTypePtr(); > else > break; > } > > Modified: cfe/trunk/include/clang/AST/TypeLoc.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/TypeLoc.h?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/AST/TypeLoc.h (original) > +++ cfe/trunk/include/clang/AST/TypeLoc.h Mon May 6 20:20:17 2019 > @@ -173,6 +173,9 @@ public: > > TypeLoc IgnoreParens() const; > > + /// Strips MacroDefinitionTypeLocs from a type location. > + TypeLoc IgnoreMacroDefinitions() const; > + > /// Find a type with the location of an explicit type qualifier. > /// > /// The result, if non-null, will be one of: > @@ -1080,6 +1083,39 @@ public: > } > }; > > +struct MacroQualifiedLocInfo { > + SourceLocation ExpansionLoc; > +}; > + > +class MacroQualifiedTypeLoc > + : public ConcreteTypeLoc<UnqualTypeLoc, MacroQualifiedTypeLoc, > + MacroQualifiedType, MacroQualifiedLocInfo> { > +public: > + void initializeLocal(ASTContext &Context, SourceLocation Loc) { > + setExpansionLoc(Loc); > + } > + > + TypeLoc getInnerLoc() const { return getInnerTypeLoc(); } > + > + const IdentifierInfo *getMacroIdentifier() const { > + return getTypePtr()->getMacroIdentifier(); > + } > + > + SourceLocation getExpansionLoc() const { > + return this->getLocalData()->ExpansionLoc; > + } > + > + void setExpansionLoc(SourceLocation Loc) { > + this->getLocalData()->ExpansionLoc = Loc; > + } > + > + QualType getInnerType() const { return > getTypePtr()->getUnderlyingType(); } > + > + SourceRange getLocalSourceRange() const { > + return getInnerLoc().getLocalSourceRange(); > + } > +}; > + > struct ParenLocInfo { > SourceLocation LParenLoc; > SourceLocation RParenLoc; > @@ -2289,6 +2325,8 @@ inline T TypeLoc::getAsAdjusted() const > Cur = ETL.getNamedTypeLoc(); > else if (auto ATL = Cur.getAs<AdjustedTypeLoc>()) > Cur = ATL.getOriginalLoc(); > + else if (auto MQL = Cur.getAs<MacroQualifiedTypeLoc>()) > + Cur = MQL.getInnerLoc(); > else > break; > } > > Modified: cfe/trunk/include/clang/AST/TypeNodes.def > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/TypeNodes.def?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/AST/TypeNodes.def (original) > +++ cfe/trunk/include/clang/AST/TypeNodes.def Mon May 6 20:20:17 2019 > @@ -82,6 +82,7 @@ TYPE(FunctionNoProto, FunctionType) > DEPENDENT_TYPE(UnresolvedUsing, Type) > NON_CANONICAL_TYPE(Paren, Type) > NON_CANONICAL_TYPE(Typedef, Type) > +NON_CANONICAL_TYPE(MacroQualified, Type) > NON_CANONICAL_TYPE(Adjusted, Type) > NON_CANONICAL_TYPE(Decayed, AdjustedType) > NON_CANONICAL_UNLESS_DEPENDENT_TYPE(TypeOfExpr, Type) > > Modified: cfe/trunk/include/clang/Parse/Parser.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Parser.h?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/Parse/Parser.h (original) > +++ cfe/trunk/include/clang/Parse/Parser.h Mon May 6 20:20:17 2019 > @@ -1158,6 +1158,7 @@ private: > Parser *Self; > CachedTokens Toks; > IdentifierInfo &AttrName; > + IdentifierInfo *MacroII = nullptr; > SourceLocation AttrNameLoc; > SmallVector<Decl*, 2> Decls; > > > Modified: cfe/trunk/include/clang/Sema/ParsedAttr.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/ParsedAttr.h?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/Sema/ParsedAttr.h (original) > +++ cfe/trunk/include/clang/Sema/ParsedAttr.h Mon May 6 20:20:17 2019 > @@ -167,6 +167,8 @@ public: > private: > IdentifierInfo *AttrName; > IdentifierInfo *ScopeName; > + IdentifierInfo *MacroII = nullptr; > + SourceLocation MacroExpansionLoc; > SourceRange AttrRange; > SourceLocation ScopeLoc; > SourceLocation EllipsisLoc; > @@ -547,6 +549,27 @@ public: > return getPropertyDataBuffer().SetterId; > } > > + /// Set the macro identifier info object that this parsed attribute was > + /// declared in if it was declared in a macro. Also set the expansion > location > + /// of the macro. > + void setMacroIdentifier(IdentifierInfo *MacroName, SourceLocation Loc) { > + MacroII = MacroName; > + MacroExpansionLoc = Loc; > + } > + > + /// Returns true if this attribute was declared in a macro. > + bool hasMacroIdentifier() const { return MacroII != nullptr; } > + > + /// Return the macro identifier if this attribute was declared in a > macro. > + /// nullptr is returned if it was not declared in a macro. > + IdentifierInfo *getMacroIdentifier() const { return MacroII; } > + > + SourceLocation getMacroExpansionLoc() const { > + assert(hasMacroIdentifier() && "Can only get the macro expansion > location " > + "if this attribute has a macro > identifier."); > + return MacroExpansionLoc; > + } > + > /// Get an index into the attribute spelling list > /// defined in Attr.td. This index is used by an attribute > /// to pretty print itself. > > Modified: cfe/trunk/include/clang/Sema/Sema.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/Sema/Sema.h (original) > +++ cfe/trunk/include/clang/Sema/Sema.h Mon May 6 20:20:17 2019 > @@ -3506,7 +3506,7 @@ public: > // Check if there is an explicit attribute, but only look through > parens. > // The intent is to look for an attribute on the current declarator, > but not > // one that came from a typedef. > - bool hasExplicitCallingConv(QualType &T); > + bool hasExplicitCallingConv(QualType T); > > /// Get the outermost AttributedType node that sets a calling > convention. > /// Valid types should not have multiple attributes with different CCs. > > Modified: cfe/trunk/include/clang/Serialization/ASTBitCodes.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTBitCodes.h?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/Serialization/ASTBitCodes.h (original) > +++ cfe/trunk/include/clang/Serialization/ASTBitCodes.h Mon May 6 > 20:20:17 2019 > @@ -1173,7 +1173,10 @@ namespace serialization { > TYPE_DEPENDENT_ADDRESS_SPACE = 47, > > /// A dependentSizedVectorType record. > - TYPE_DEPENDENT_SIZED_VECTOR = 48 > + TYPE_DEPENDENT_SIZED_VECTOR = 48, > + > + /// A type defined in a macro. > + TYPE_MACRO_QUALIFIED = 49 > }; > > /// The type IDs for special types constructed by semantic > > Modified: cfe/trunk/lib/ARCMigrate/TransGCAttrs.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ARCMigrate/TransGCAttrs.cpp?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/lib/ARCMigrate/TransGCAttrs.cpp (original) > +++ cfe/trunk/lib/ARCMigrate/TransGCAttrs.cpp Mon May 6 20:20:17 2019 > @@ -68,6 +68,9 @@ public: > if (handleAttr(Attr, D)) > break; > TL = Attr.getModifiedLoc(); > + } else if (MacroQualifiedTypeLoc MDTL = > + TL.getAs<MacroQualifiedTypeLoc>()) { > + TL = MDTL.getInnerLoc(); > } else if (ArrayTypeLoc Arr = TL.getAs<ArrayTypeLoc>()) { > TL = Arr.getElementLoc(); > } else if (PointerTypeLoc PT = TL.getAs<PointerTypeLoc>()) { > > Modified: cfe/trunk/lib/AST/ASTContext.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/lib/AST/ASTContext.cpp (original) > +++ cfe/trunk/lib/AST/ASTContext.cpp Mon May 6 20:20:17 2019 > @@ -2047,6 +2047,10 @@ TypeInfo ASTContext::getTypeInfoImpl(con > case Type::Paren: > return getTypeInfo(cast<ParenType>(T)->getInnerType().getTypePtr()); > > + case Type::MacroQualified: > + return getTypeInfo( > + cast<MacroQualifiedType>(T)->getUnderlyingType().getTypePtr()); > + > case Type::ObjCTypeParam: > return > getTypeInfo(cast<ObjCTypeParamType>(T)->desugar().getTypePtr()); > > @@ -3929,7 +3933,7 @@ QualType ASTContext::getAttributedType(a > > QualType canon = getCanonicalType(equivalentType); > type = new (*this, TypeAlignment) > - AttributedType(canon, attrKind, modifiedType, equivalentType); > + AttributedType(canon, attrKind, modifiedType, equivalentType); > > Types.push_back(type); > AttributedTypes.InsertNode(type, insertPos); > @@ -4210,6 +4214,19 @@ ASTContext::getParenType(QualType InnerT > return QualType(T, 0); > } > > +QualType > +ASTContext::getMacroQualifiedType(QualType UnderlyingTy, > + const IdentifierInfo *MacroII) const { > + QualType Canon = UnderlyingTy; > + if (!Canon.isCanonical()) > + Canon = getCanonicalType(UnderlyingTy); > + > + auto *newType = new (*this, TypeAlignment) > + MacroQualifiedType(UnderlyingTy, Canon, MacroII); > + Types.push_back(newType); > + return QualType(newType, 0); > +} > + > QualType ASTContext::getDependentNameType(ElaboratedTypeKeyword Keyword, > NestedNameSpecifier *NNS, > const IdentifierInfo *Name, > > Modified: cfe/trunk/lib/AST/ASTDiagnostic.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTDiagnostic.cpp?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/lib/AST/ASTDiagnostic.cpp (original) > +++ cfe/trunk/lib/AST/ASTDiagnostic.cpp Mon May 6 20:20:17 2019 > @@ -41,6 +41,11 @@ static QualType Desugar(ASTContext &Cont > QT = PT->desugar(); > continue; > } > + // ... or a macro defined type ... > + if (const MacroQualifiedType *MDT = dyn_cast<MacroQualifiedType>(Ty)) > { > + QT = MDT->desugar(); > + continue; > + } > // ...or a substituted template type parameter ... > if (const SubstTemplateTypeParmType *ST = > dyn_cast<SubstTemplateTypeParmType>(Ty)) { > > Modified: cfe/trunk/lib/AST/ASTStructuralEquivalence.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTStructuralEquivalence.cpp?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/lib/AST/ASTStructuralEquivalence.cpp (original) > +++ cfe/trunk/lib/AST/ASTStructuralEquivalence.cpp Mon May 6 20:20:17 2019 > @@ -595,6 +595,13 @@ static bool IsStructurallyEquivalent(Str > return false; > break; > > + case Type::MacroQualified: > + if (!IsStructurallyEquivalent( > + Context, cast<MacroQualifiedType>(T1)->getUnderlyingType(), > + cast<MacroQualifiedType>(T2)->getUnderlyingType())) > + return false; > + break; > + > case Type::Typedef: > if (!IsStructurallyEquivalent(Context, > cast<TypedefType>(T1)->getDecl(), > cast<TypedefType>(T2)->getDecl())) > > Modified: cfe/trunk/lib/AST/ItaniumMangle.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ItaniumMangle.cpp?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/lib/AST/ItaniumMangle.cpp (original) > +++ cfe/trunk/lib/AST/ItaniumMangle.cpp Mon May 6 20:20:17 2019 > @@ -1963,6 +1963,7 @@ bool CXXNameMangler::mangleUnresolvedTyp > case Type::ObjCTypeParam: > case Type::Atomic: > case Type::Pipe: > + case Type::MacroQualified: > llvm_unreachable("type is illegal as a nested name specifier"); > > case Type::SubstTemplateTypeParmPack: > > Modified: cfe/trunk/lib/AST/Type.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Type.cpp?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/lib/AST/Type.cpp (original) > +++ cfe/trunk/lib/AST/Type.cpp Mon May 6 20:20:17 2019 > @@ -973,6 +973,7 @@ public: > > SUGARED_TYPE_CLASS(Typedef) > SUGARED_TYPE_CLASS(ObjCTypeParam) > + SUGARED_TYPE_CLASS(MacroQualified) > > QualType VisitAdjustedType(const AdjustedType *T) { > QualType originalType = recurse(T->getOriginalType()); > @@ -1735,6 +1736,10 @@ namespace { > return Visit(T->getModifiedType()); > } > > + Type *VisitMacroQualifiedType(const MacroQualifiedType *T) { > + return Visit(T->getUnderlyingType()); > + } > + > Type *VisitAdjustedType(const AdjustedType *T) { > return Visit(T->getOriginalType()); > } > @@ -3160,6 +3165,20 @@ QualType TypedefType::desugar() const { > return getDecl()->getUnderlyingType(); > } > > +QualType MacroQualifiedType::desugar() const { return > getUnderlyingType(); } > + > +QualType MacroQualifiedType::getModifiedType() const { > + // Step over MacroQualifiedTypes from the same macro to find the type > + // ultimately qualified by the macro qualifier. > + QualType Inner = > cast<AttributedType>(getUnderlyingType())->getModifiedType(); > + while (auto *InnerMQT = dyn_cast<MacroQualifiedType>(Inner)) { > + if (InnerMQT->getMacroIdentifier() != getMacroIdentifier()) > + break; > + Inner = InnerMQT->getModifiedType(); > + } > + return Inner; > +} > + > TypeOfExprType::TypeOfExprType(Expr *E, QualType can) > : Type(TypeOfExpr, can, E->isTypeDependent(), > E->isInstantiationDependent(), > > Modified: cfe/trunk/lib/AST/TypePrinter.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/TypePrinter.cpp?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/lib/AST/TypePrinter.cpp (original) > +++ cfe/trunk/lib/AST/TypePrinter.cpp Mon May 6 20:20:17 2019 > @@ -259,6 +259,7 @@ bool TypePrinter::canPrefixQualifiers(co > case Type::Paren: > case Type::PackExpansion: > case Type::SubstTemplateTypeParm: > + case Type::MacroQualified: > CanPrefixQualifiers = false; > break; > > @@ -963,6 +964,21 @@ void TypePrinter::printTypedefBefore(con > printTypeSpec(T->getDecl(), OS); > } > > +void TypePrinter::printMacroQualifiedBefore(const MacroQualifiedType *T, > + raw_ostream &OS) { > + StringRef MacroName = T->getMacroIdentifier()->getName(); > + OS << MacroName << " "; > + > + // Since this type is meant to print the macro instead of the whole > attribute, > + // we trim any attributes and go directly to the original modified type. > + printBefore(T->getModifiedType(), OS); > +} > + > +void TypePrinter::printMacroQualifiedAfter(const MacroQualifiedType *T, > + raw_ostream &OS) { > + printAfter(T->getModifiedType(), OS); > +} > + > void TypePrinter::printTypedefAfter(const TypedefType *T, raw_ostream > &OS) {} > > void TypePrinter::printTypeOfExprBefore(const TypeOfExprType *T, > > Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Mon May 6 20:20:17 2019 > @@ -2844,6 +2844,9 @@ static QualType UnwrapTypeForDebugInfo(Q > case Type::Paren: > T = cast<ParenType>(T)->getInnerType(); > break; > + case Type::MacroQualified: > + T = cast<MacroQualifiedType>(T)->getUnderlyingType(); > + break; > case Type::SubstTemplateTypeParm: > T = cast<SubstTemplateTypeParmType>(T)->getReplacementType(); > break; > @@ -3023,6 +3026,7 @@ llvm::DIType *CGDebugInfo::CreateTypeNod > case Type::DeducedTemplateSpecialization: > case Type::Elaborated: > case Type::Paren: > + case Type::MacroQualified: > case Type::SubstTemplateTypeParm: > case Type::TypeOfExpr: > case Type::TypeOf: > > Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.cpp?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/lib/CodeGen/CodeGenFunction.cpp (original) > +++ cfe/trunk/lib/CodeGen/CodeGenFunction.cpp Mon May 6 20:20:17 2019 > @@ -2149,6 +2149,7 @@ void CodeGenFunction::EmitVariablyModifi > case Type::Attributed: > case Type::SubstTemplateTypeParm: > case Type::PackExpansion: > + case Type::MacroQualified: > // Keep walking after single level desugaring. > type = type.getSingleStepDesugaredType(getContext()); > break; > > Modified: cfe/trunk/lib/Parse/ParseDecl.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/lib/Parse/ParseDecl.cpp (original) > +++ cfe/trunk/lib/Parse/ParseDecl.cpp Mon May 6 20:20:17 2019 > @@ -85,6 +85,23 @@ static bool isAttributeLateParsed(const > #undef CLANG_ATTR_LATE_PARSED_LIST > } > > +/// Check if the a start and end source location expand to the same macro. > +bool FindLocsWithCommonFileID(Preprocessor &PP, SourceLocation StartLoc, > + SourceLocation EndLoc) { > + if (!StartLoc.isMacroID() || !EndLoc.isMacroID()) > + return false; > + > + SourceManager &SM = PP.getSourceManager(); > + if (SM.getFileID(StartLoc) != SM.getFileID(EndLoc)) > + return false; > + > + bool AttrStartIsInMacro = > + Lexer::isAtStartOfMacroExpansion(StartLoc, SM, PP.getLangOpts()); > + bool AttrEndIsInMacro = > + Lexer::isAtEndOfMacroExpansion(EndLoc, SM, PP.getLangOpts()); > + return AttrStartIsInMacro && AttrEndIsInMacro; > +} > + > /// ParseGNUAttributes - Parse a non-empty attributes list. > /// > /// [GNU] attributes: > @@ -133,7 +150,10 @@ void Parser::ParseGNUAttributes(ParsedAt > assert(Tok.is(tok::kw___attribute) && "Not a GNU attribute list!"); > > while (Tok.is(tok::kw___attribute)) { > - ConsumeToken(); > + SourceLocation AttrTokLoc = ConsumeToken(); > + unsigned OldNumAttrs = attrs.size(); > + unsigned OldNumLateAttrs = LateAttrs ? LateAttrs->size() : 0; > + > if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen_after, > "attribute")) { > SkipUntil(tok::r_paren, StopAtSemi); // skip until ) or ; > @@ -201,6 +221,24 @@ void Parser::ParseGNUAttributes(ParsedAt > SkipUntil(tok::r_paren, StopAtSemi); > if (endLoc) > *endLoc = Loc; > + > + // If this was declared in a macro, attach the macro IdentifierInfo > to the > + // parsed attribute. > + if (FindLocsWithCommonFileID(PP, AttrTokLoc, Loc)) { > + auto &SM = PP.getSourceManager(); > + CharSourceRange ExpansionRange = SM.getExpansionRange(AttrTokLoc); > + StringRef FoundName = > + Lexer::getSourceText(ExpansionRange, SM, PP.getLangOpts()); > + IdentifierInfo *MacroII = PP.getIdentifierInfo(FoundName); > + > + for (unsigned i = OldNumAttrs; i < attrs.size(); ++i) > + attrs[i].setMacroIdentifier(MacroII, ExpansionRange.getBegin()); > + > + if (LateAttrs) { > + for (unsigned i = OldNumLateAttrs; i < LateAttrs->size(); ++i) > + (*LateAttrs)[i]->MacroII = MacroII; > + } > + } > } > } > > > Modified: cfe/trunk/lib/Sema/SemaExpr.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) > +++ cfe/trunk/lib/Sema/SemaExpr.cpp Mon May 6 20:20:17 2019 > @@ -4096,6 +4096,7 @@ static void captureVariablyModifiedType( > case Type::Attributed: > case Type::SubstTemplateTypeParm: > case Type::PackExpansion: > + case Type::MacroQualified: > // Keep walking after single level desugaring. > T = T.getSingleStepDesugaredType(Context); > break; > @@ -13695,8 +13696,8 @@ void Sema::ActOnBlockArguments(SourceLoc > // Look for an explicit signature in that function type. > FunctionProtoTypeLoc ExplicitSignature; > > - if ((ExplicitSignature = > - Sig->getTypeLoc().getAsAdjusted<FunctionProtoTypeLoc>())) { > + if ((ExplicitSignature = Sig->getTypeLoc() > + .getAsAdjusted<FunctionProtoTypeLoc>())) { > > // Check whether that explicit signature was synthesized by > // GetTypeForDeclarator. If so, don't save that as part of the > > Modified: cfe/trunk/lib/Sema/SemaStmt.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaStmt.cpp?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/SemaStmt.cpp (original) > +++ cfe/trunk/lib/Sema/SemaStmt.cpp Mon May 6 20:20:17 2019 > @@ -3390,10 +3390,10 @@ bool LocalTypedefNameReferencer::VisitRe > } > > TypeLoc Sema::getReturnTypeLoc(FunctionDecl *FD) const { > - TypeLoc TL = FD->getTypeSourceInfo()->getTypeLoc().IgnoreParens(); > - while (auto ATL = TL.getAs<AttributedTypeLoc>()) > - TL = ATL.getModifiedLoc().IgnoreParens(); > - return TL.castAs<FunctionProtoTypeLoc>().getReturnLoc(); > + return FD->getTypeSourceInfo() > + ->getTypeLoc() > + .getAsAdjusted<FunctionProtoTypeLoc>() > + .getReturnLoc(); > } > > /// Deduce the return type for a function from a returned expression, per > > Modified: cfe/trunk/lib/Sema/SemaType.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/SemaType.cpp (original) > +++ cfe/trunk/lib/Sema/SemaType.cpp Mon May 6 20:20:17 2019 > @@ -182,6 +182,10 @@ namespace { > SmallVector<TypeAttrPair, 8> AttrsForTypes; > bool AttrsForTypesSorted = true; > > + /// MacroQualifiedTypes mapping to macro expansion locations that > will be > + /// stored in a MacroQualifiedTypeLoc. > + llvm::DenseMap<const MacroQualifiedType *, SourceLocation> > LocsForMacros; > + > /// Flag to indicate we parsed a noderef attribute. This is used for > /// validating that noderef was used on a pointer or array. > bool parsedNoDeref; > @@ -295,6 +299,19 @@ namespace { > llvm_unreachable("no Attr* for AttributedType*"); > } > > + SourceLocation > + getExpansionLocForMacroQualifiedType(const MacroQualifiedType *MQT) > const { > + auto FoundLoc = LocsForMacros.find(MQT); > + assert(FoundLoc != LocsForMacros.end() && > + "Unable to find macro expansion location for > MacroQualifedType"); > + return FoundLoc->second; > + } > + > + void setExpansionLocForMacroQualifiedType(const MacroQualifiedType > *MQT, > + SourceLocation Loc) { > + LocsForMacros[MQT] = Loc; > + } > + > void setParsedNoDeref(bool parsed) { parsedNoDeref = parsed; } > > bool didParseNoDeref() const { return parsedNoDeref; } > @@ -5644,6 +5661,9 @@ namespace { > assert(Chunk.Kind == DeclaratorChunk::Pipe); > TL.setKWLoc(Chunk.Loc); > } > + void VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) { > + TL.setExpansionLoc(Chunk.Loc); > + } > > void VisitTypeLoc(TypeLoc TL) { > llvm_unreachable("unsupported TypeLoc kind in declarator!"); > @@ -5722,6 +5742,12 @@ GetTypeSourceInfoForDeclarator(TypeProce > CurrTL = ATL.getValueLoc().getUnqualifiedLoc(); > } > > + while (MacroQualifiedTypeLoc TL = > CurrTL.getAs<MacroQualifiedTypeLoc>()) { > + TL.setExpansionLoc( > + State.getExpansionLocForMacroQualifiedType(TL.getTypePtr())); > + CurrTL = TL.getNextTypeLoc().getUnqualifiedLoc(); > + } > + > while (AttributedTypeLoc TL = CurrTL.getAs<AttributedTypeLoc>()) { > fillAttributedTypeLoc(TL, State); > CurrTL = TL.getNextTypeLoc().getUnqualifiedLoc(); > @@ -6982,12 +7008,16 @@ static bool handleFunctionTypeAttr(TypeP > return true; > } > > -bool Sema::hasExplicitCallingConv(QualType &T) { > - QualType R = T.IgnoreParens(); > - while (const AttributedType *AT = dyn_cast<AttributedType>(R)) { > +bool Sema::hasExplicitCallingConv(QualType T) { > + const AttributedType *AT; > + > + // Stop if we'd be stripping off a typedef sugar node to reach the > + // AttributedType. > + while ((AT = T->getAs<AttributedType>()) && > + AT->getAs<TypedefType>() == T->getAs<TypedefType>()) { > if (AT->isCallingConv()) > return true; > - R = AT->getModifiedType().IgnoreParens(); > + T = AT->getModifiedType(); > } > return false; > } > @@ -7572,6 +7602,18 @@ static void processTypeAttrs(TypeProcess > distributeFunctionTypeAttr(state, attr, type); > break; > } > + > + // Handle attributes that are defined in a macro. We do not want this > to be > + // applied to ObjC builtin attributes. > + if (isa<AttributedType>(type) && attr.hasMacroIdentifier() && > + !type.getQualifiers().hasObjCLifetime() && > + !type.getQualifiers().hasObjCGCAttr()) { > + const IdentifierInfo *MacroII = attr.getMacroIdentifier(); > + type = state.getSema().Context.getMacroQualifiedType(type, MacroII); > + state.setExpansionLocForMacroQualifiedType( > + cast<MacroQualifiedType>(type.getTypePtr()), > + attr.getMacroExpansionLoc()); > + } > } > > if (!state.getSema().getLangOpts().OpenCL || > > Modified: cfe/trunk/lib/Sema/TreeTransform.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/TreeTransform.h (original) > +++ cfe/trunk/lib/Sema/TreeTransform.h Mon May 6 20:20:17 2019 > @@ -883,6 +883,12 @@ public: > return SemaRef.Context.getTypeDeclType(Typedef); > } > > + /// Build a new MacroDefined type. > + QualType RebuildMacroQualifiedType(QualType T, > + const IdentifierInfo *MacroII) { > + return SemaRef.Context.getMacroQualifiedType(T, MacroII); > + } > + > /// Build a new class/struct/union type. > QualType RebuildRecordType(RecordDecl *Record) { > return SemaRef.Context.getTypeDeclType(Record); > @@ -6193,6 +6199,27 @@ TreeTransform<Derived>::TransformParenTy > return Result; > } > > +template <typename Derived> > +QualType > +TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB, > + MacroQualifiedTypeLoc > TL) { > + QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); > + if (Inner.isNull()) > + return QualType(); > + > + QualType Result = TL.getType(); > + if (getDerived().AlwaysRebuild() || Inner != > TL.getInnerLoc().getType()) { > + Result = > + getDerived().RebuildMacroQualifiedType(Inner, > TL.getMacroIdentifier()); > + if (Result.isNull()) > + return QualType(); > + } > + > + MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result); > + NewTL.setExpansionLoc(TL.getExpansionLoc()); > + return Result; > +} > + > template<typename Derived> > QualType TreeTransform<Derived>::TransformDependentNameType( > TypeLocBuilder &TLB, DependentNameTypeLoc TL) { > > Modified: cfe/trunk/lib/Serialization/ASTReader.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/lib/Serialization/ASTReader.cpp (original) > +++ cfe/trunk/lib/Serialization/ASTReader.cpp Mon May 6 20:20:17 2019 > @@ -6200,6 +6200,16 @@ QualType ASTReader::readTypeRecord(unsig > return Context.getParenType(InnerType); > } > > + case TYPE_MACRO_QUALIFIED: { > + if (Record.size() != 2) { > + Error("incorrect encoding of macro defined type"); > + return QualType(); > + } > + QualType UnderlyingTy = readType(*Loc.F, Record, Idx); > + IdentifierInfo *MacroII = GetIdentifierInfo(*Loc.F, Record, Idx); > + return Context.getMacroQualifiedType(UnderlyingTy, MacroII); > + } > + > case TYPE_PACK_EXPANSION: { > if (Record.size() != 2) { > Error("incorrect encoding of pack expansion type"); > @@ -6521,6 +6531,10 @@ void TypeLocReader::VisitAdjustedTypeLoc > // nothing to do > } > > +void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) { > + TL.setExpansionLoc(ReadSourceLocation()); > +} > + > void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) { > TL.setCaretLoc(ReadSourceLocation()); > } > > Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/lib/Serialization/ASTWriter.cpp (original) > +++ cfe/trunk/lib/Serialization/ASTWriter.cpp Mon May 6 20:20:17 2019 > @@ -516,6 +516,12 @@ void ASTTypeWriter::VisitParenType(const > Code = TYPE_PAREN; > } > > +void ASTTypeWriter::VisitMacroQualifiedType(const MacroQualifiedType *T) { > + Record.AddTypeRef(T->getUnderlyingType()); > + Record.AddIdentifierRef(T->getMacroIdentifier()); > + Code = TYPE_MACRO_QUALIFIED; > +} > + > void ASTTypeWriter::VisitElaboratedType(const ElaboratedType *T) { > Record.push_back(T->getKeyword()); > Record.AddNestedNameSpecifier(T->getQualifier()); > @@ -802,6 +808,10 @@ void TypeLocWriter::VisitParenTypeLoc(Pa > Record.AddSourceLocation(TL.getRParenLoc()); > } > > +void TypeLocWriter::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) { > + Record.AddSourceLocation(TL.getExpansionLoc()); > +} > + > void TypeLocWriter::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) { > Record.AddSourceLocation(TL.getElaboratedKeywordLoc()); > Record.AddNestedNameSpecifierLoc(TL.getQualifierLoc()); > @@ -1219,6 +1229,7 @@ void ASTWriter::WriteBlockInfoBlock() { > RECORD(TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION); > RECORD(TYPE_DEPENDENT_SIZED_ARRAY); > RECORD(TYPE_PAREN); > + RECORD(TYPE_MACRO_QUALIFIED); > RECORD(TYPE_PACK_EXPANSION); > RECORD(TYPE_ATTRIBUTED); > RECORD(TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK); > > Added: cfe/trunk/test/Frontend/macro_defined_type.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/macro_defined_type.cpp?rev=360109&view=auto > > ============================================================================== > --- cfe/trunk/test/Frontend/macro_defined_type.cpp (added) > +++ cfe/trunk/test/Frontend/macro_defined_type.cpp Mon May 6 20:20:17 2019 > @@ -0,0 +1,15 @@ > +// RUN: %clang_cc1 -fsyntax-only -verify %s > + > +#define NODEREF __attribute__((noderef)) > + > +void Func() { > + int NODEREF i; // expected-warning{{'noderef' can only be used on an > array or pointer type}} > + int NODEREF *i_ptr; > + > + // There should be no difference whether a macro defined type is used > or not. > + auto __attribute__((noderef)) *auto_i_ptr = i_ptr; > + auto __attribute__((noderef)) auto_i = i; // > expected-warning{{'noderef' can only be used on an array or pointer type}} > + > + auto NODEREF *auto_i_ptr2 = i_ptr; > + auto NODEREF auto_i2 = i; // expected-warning{{'noderef' can only be > used on an array or pointer type}} > +} > > Added: cfe/trunk/test/Sema/address_space_print_macro.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/address_space_print_macro.c?rev=360109&view=auto > > ============================================================================== > --- cfe/trunk/test/Sema/address_space_print_macro.c (added) > +++ cfe/trunk/test/Sema/address_space_print_macro.c Mon May 6 20:20:17 > 2019 > @@ -0,0 +1,67 @@ > +// RUN: %clang_cc1 %s -fsyntax-only -verify > + > +#define AS1 __attribute__((address_space(1))) > +#define AS2 __attribute__((address_space(2), annotate("foo"))) > +#define AS_ND __attribute__((address_space(2), noderef)) > + > +#define AS(i) address_space(i) > +#define AS3 __attribute__((AS(3))) > +#define AS5 __attribute__((address_space(5))) char > + > +void normal_case() { > + int *p = 0; > + __attribute__((address_space(1))) int *q = p; // > expected-error{{initializing '__attribute__((address_space(1))) int *' with > an expression of type 'int *' changes address space of pointer}} > +} > + > +char *cmp(AS1 char *x, AS2 char *y) { > + return x < y ? x : y; // expected-error{{conditional operator with the > second and third operands of type ('AS1 char *' and 'AS2 char *') which > are pointers to non-overlapping address spaces}} > +} > + > +__attribute__((address_space(1))) char test_array[10]; > +void test3(void) { > + extern void test3_helper(char *p); // expected-note{{passing argument > to parameter 'p' here}} > + test3_helper(test_array); // expected-error{{passing > '__attribute__((address_space(1))) char *' to parameter of type 'char *' > changes address space of pointer}} > +} > + > +char AS2 *test4_array; > +void test4(void) { > + extern void test3_helper(char *p); // expected-note{{passing argument > to parameter 'p' here}} > + test3_helper(test4_array); // expected-error{{passing 'AS2 char > *' to parameter of type 'char *' changes address space of pointer}} > +} > + > +void func() { > + char AS1 *x; > + char AS3 *x2; > + AS5 *x3; > + char *y; > + y = x; // expected-error{{assigning 'AS1 char *' to 'char *' changes > address space of pointer}} > + y = x2; // expected-error{{assigning 'AS3 char *' to 'char *' changes > address space of pointer}} > + y = x3; // expected-error{{assigning '__attribute__((address_space(5))) > char *' to 'char *' changes address space of pointer}} > +} > + > +void multiple_attrs(AS_ND int *x) { > + __attribute__((address_space(2))) int *y = x; // > expected-warning{{casting to dereferenceable pointer removes 'noderef' > attribute}} > +} > + > +void override_macro_name() { > +#define ATTRS __attribute__((noderef)) // expected-note{{previous > definition is here}} > + ATTRS > +#define ATTRS __attribute__((address_space(1))) // > expected-warning{{'ATTRS' macro redefined}} > + ATTRS > + int *x; > + > + int AS_ND *y = x; // expected-error{{initializing 'AS_ND int *' with an > expression of type 'ATTRS int *' changes address space of pointer}} > +} > + > +void partial_macro_declaration() { > +#define ATTRS2 __attribute__((noderef)) > + ATTRS2 __attribute__((address_space(1))) int *x; > + > + int AS_ND *y = x; // expected-error{{initializing 'AS_ND int *' with an > expression of type 'ATTRS2 int __attribute__((address_space(1))) *' changes > address space of pointer}} > + > + // The attribute not wrapped with a macro should be printed regularly. > +#define ATTRS3 __attribute__((address_space(1))) > + ATTRS3 __attribute__((noderef)) int *x2; > + > + int AS_ND *y2 = x2; // expected-error{{initializing 'AS_ND int *' with > an expression of type 'ATTRS3 int * __attribute__((noderef))' changes > address space of pointer}} > +} > > Modified: cfe/trunk/test/Sema/address_spaces.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/address_spaces.c?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/test/Sema/address_spaces.c (original) > +++ cfe/trunk/test/Sema/address_spaces.c Mon May 6 20:20:17 2019 > @@ -71,7 +71,7 @@ __attribute__((address_space("12"))) int > > // Clang extension doesn't forbid operations on pointers to different > address spaces. > char* cmp(_AS1 char *x, _AS2 char *y) { > - return x < y ? x : y; // expected-error{{conditional operator with the > second and third operands of type ('__attribute__((address_space(1))) char > *' and '__attribute__((address_space(2))) char *') which are pointers to > non-overlapping address spaces}} > + return x < y ? x : y; // expected-error{{conditional operator with the > second and third operands of type ('_AS1 char *' and '_AS2 char *') which > are pointers to non-overlapping address spaces}} > } > > struct SomeStruct { > > Modified: cfe/trunk/test/SemaObjC/externally-retained.m > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/externally-retained.m?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/test/SemaObjC/externally-retained.m (original) > +++ cfe/trunk/test/SemaObjC/externally-retained.m Mon May 6 20:20:17 2019 > @@ -68,6 +68,12 @@ void (^blk)(ObjCTy *, ObjCTy *) = > second = 0; // expected-error{{variable declared with > 'objc_externally_retained' cannot be modified in ARC}} > }; > > +void (^blk2)(ObjCTy *, ObjCTy *) = > + ^(__strong ObjCTy *first, ObjCTy *second) > __attribute__((objc_externally_retained)) { > + first = 0; > + second = 0; // expected-error{{variable declared with > 'objc_externally_retained' cannot be modified in ARC}} > +}; > + > void test8(EXT_RET ObjCTy *x) {} // > expected-warning{{'objc_externally_retained' attribute only applies to > variables}} > > #pragma clang attribute > ext_ret.push(__attribute__((objc_externally_retained)), > apply_to=any(function, block, objc_method)) > > Modified: cfe/trunk/test/SemaObjC/gc-attributes.m > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/gc-attributes.m?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/test/SemaObjC/gc-attributes.m (original) > +++ cfe/trunk/test/SemaObjC/gc-attributes.m Mon May 6 20:20:17 2019 > @@ -9,7 +9,7 @@ void test_f0() { > A *a; > static __weak A *a2; > f0(&a); > - f0(&a2); // expected-warning{{passing 'A *__weak *' to parameter of > type 'A *__strong *' discards qualifiers}} > + f0(&a2); // expected-warning{{passing 'A *__weak *' to parameter of > type 'A *__strong *' discards qualifiers}} > } > > void f1(__weak A**); // expected-note{{passing argument to parameter > here}} > @@ -18,7 +18,7 @@ void test_f1() { > A *a; > __strong A *a2; > f1(&a); > - f1(&a2); // expected-warning{{passing 'A *__strong *' to parameter of > type 'A *__weak *' discards qualifiers}} > + f1(&a2); // expected-warning{{passing 'A *__strong *' to parameter of > type 'A *__weak *' discards qualifiers}} > } > > // These qualifiers should silently expand to nothing in GC mode. > > Modified: cfe/trunk/test/SemaObjC/mrc-weak.m > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/mrc-weak.m?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/test/SemaObjC/mrc-weak.m (original) > +++ cfe/trunk/test/SemaObjC/mrc-weak.m Mon May 6 20:20:17 2019 > @@ -62,6 +62,6 @@ void test_unsafe_unretained_cast(id *val > > void test_cast_qualifier_inference(__weak id *value) { > __weak id *a = (id*) value; > - __unsafe_unretained id *b = (id*) value; // expected-error > {{initializing 'id *' with an expression of type '__weak id *' changes > retain/release properties of pointer}} > + __unsafe_unretained id *b = (id *)value; // expected-error > {{initializing '__unsafe_unretained id *' with an expression of type > '__weak id *' changes retain/release properties of pointer}} > } > > > Modified: cfe/trunk/test/SemaObjCXX/gc-attributes.mm > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjCXX/gc-attributes.mm?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/test/SemaObjCXX/gc-attributes.mm (original) > +++ cfe/trunk/test/SemaObjCXX/gc-attributes.mm Mon May 6 20:20:17 2019 > @@ -3,7 +3,7 @@ > @interface A > @end > > -void f0(__strong A**); // expected-note{{candidate function not viable: > 1st argument ('A *__weak *') has __weak ownership, but parameter has > __strong ownership}} > +void f0(__strong A **); // expected-note{{candidate function not viable: > 1st argument ('A *__weak *') has __weak ownership, but parameter has > __strong ownership}} > > void test_f0() { > A *a; > @@ -12,7 +12,7 @@ void test_f0() { > f0(&a2); // expected-error{{no matching function}} > } > > -void f1(__weak A**); // expected-note{{candidate function not viable: 1st > argument ('A *__strong *') has __strong ownership, but parameter has __weak > ownership}} > +void f1(__weak A **); // expected-note{{candidate function not viable: > 1st argument ('A *__strong *') has __strong ownership, but parameter has > __weak ownership}} > > void test_f1() { > A *a; > > Modified: cfe/trunk/tools/libclang/CIndex.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=360109&r1=360108&r2=360109&view=diff > > ============================================================================== > --- cfe/trunk/tools/libclang/CIndex.cpp (original) > +++ cfe/trunk/tools/libclang/CIndex.cpp Mon May 6 20:20:17 2019 > @@ -1614,6 +1614,10 @@ bool CursorVisitor::VisitParenTypeLoc(Pa > return Visit(TL.getInnerLoc()); > } > > +bool CursorVisitor::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) { > + return Visit(TL.getInnerLoc()); > +} > + > bool CursorVisitor::VisitPointerTypeLoc(PointerTypeLoc TL) { > return Visit(TL.getPointeeLoc()); > } > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits