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