Just wanted to update. My latest revision (r360225) seems to have fixed the bots. 🎉
On Tue, May 7, 2019 at 3:50 PM Jonas Devlieghere <jo...@devlieghere.com> wrote: > Hi Leonard, > > My personal rule of thumb is that if I can fix it in something like 30 > minutes or less, I'll leave the bot red and commit a fix. Otherwise I'll > revert my change. The problem with leaving the bot red is that if something > else breaks, that person doesn't get a signal, and issue start to pile up. > > When I see a bot is red and it's blocking me, I will usually send an > e-mail and wait about the same time for a reply, before reverting the > change myself. > > Cheers, > Jonas > > On Tue, May 7, 2019 at 11:20 AM Leonard Chan <leonardc...@google.com> > wrote: > >> Thanks! It turns out that we weren't running debuginfo-tests. Trying to >> find a mac I can ssh into to reproduce this. >> >> Another side question: is there usually an etiquette for how long a >> greendragon bot is allowed to stay broken? I don't want to leave it that >> way for too long while working on my fix if it bothers others too much. >> >> Thanks, >> Leonard >> >> On Tue, May 7, 2019 at 10:13 AM Jonas Devlieghere <jo...@devlieghere.com> >> wrote: >> >>> Hi Leonard, >>> >>> The test that is asserting is part of the debuginfo test. ( >>> https://github.com/llvm-project/debuginfo-tests) >>> The reason that it's only failing on the non-incremental bot is because >>> the incremental one isn't running those, I believe. >>> >>> RA stands for Release/Asserts. >>> >>> Hope that helps! >>> >>> Cheers, >>> Jonas >>> >>> On Tue, May 7, 2019 at 9:44 AM Leonard Chan <leonardc...@google.com> >>> wrote: >>> >>>> Yup, sorry for the delay. I submitted it overnight thinking it would be >>>> fixed this time. I have one more way that I think should fix it, but before >>>> trying it out, do you know any tips on how I can try to reproduce this >>>> locally? I see that you're running these on an x64 mac, but I can't seem to >>>> trigger this on our own mac builders. Also as a side question, do you what >>>> RA stands for in "Clang Stage 1: cmake, incremental RA, using system >>>> compiler >>>> <http://green.lab.llvm.org/green/job/clang-stage1-cmake-RA-incremental/>"? >>>> It seems that I'm only breaking the non-incremental RA jobs, bit the >>>> incremental one still works fine with my change. >>>> >>>> Thanks, >>>> Leonard >>>> >>>> On Tue, May 7, 2019, 09:26 Jonas Devlieghere <jo...@devlieghere.com> >>>> wrote: >>>> >>>>> Hi Leonard, >>>>> >>>>> It appears that your patch is still triggering an assertion on >>>>> GreenDragon: >>>>> http://green.lab.llvm.org/green/job/clang-stage1-configure-RA/56255/consoleFull#312501878d489585b-5106-414a-ac11-3ff90657619c >>>>> >>>>> Can you please have a look? >>>>> >>>>> Thanks, >>>>> Jonas >>>>> >>>>> >>>>> On Mon, May 6, 2019 at 8:17 PM Leonard Chan via cfe-commits < >>>>> cfe-commits@lists.llvm.org> wrote: >>>>> >>>>>> 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