r360109 - Recommit r359859 "[Attribute/Diagnostics] Print macro if definition is an attribute declaration"

Leonard Chan via cfe-commits cfe-commits at lists.llvm.org
Mon May 20 15:42:46 PDT 2019


Thanks for bringing this up! I submitted r361205 which should fix this. The
problem seemed to be that stripOuterNullability() was missing checks for
AttributedTypes that were wrapped in the MacroQualifiedType which this
patch introduces, so I just added a check for that type also. The reason
replacing UI_APPEARANCE_SELECTOR with
__attribute__((annotate("ui_appearance_selector"))) is because this type
wraps AttributedTypes for special cases when the entire attribute is
declared in a macro.

*From: *Nico Weber <thakis at chromium.org>
*Date: *Mon, May 20, 2019 at 11:34 AM
*To: *Leonard Chan
*Cc: *cfe-commits

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


More information about the cfe-commits mailing list