diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -6291,7 +6291,8 @@ Pointer, BlockPointer, Reference, - MemberPointer + MemberPointer, + MacroQualified, }; QualType Original; @@ -6322,6 +6323,9 @@ } else if (isa(Ty)) { T = cast(Ty)->getEquivalentType(); Stack.push_back(Attributed); + } else if (isa(Ty)) { + T = cast(Ty)->getUnderlyingType(); + Stack.push_back(MacroQualified); } else { const Type *DTy = Ty->getUnqualifiedDesugaredType(); if (Ty == DTy) { @@ -6378,6 +6382,9 @@ return C.getParenType(New); } + case MacroQualified: + return wrap(C, cast(Old)->getUnderlyingType(), I); + case Pointer: { QualType New = wrap(C, cast(Old)->getPointeeType(), I); return C.getPointerType(New); diff --git a/clang/test/Frontend/macro_defined_type.cpp b/clang/test/Frontend/macro_defined_type.cpp --- a/clang/test/Frontend/macro_defined_type.cpp +++ b/clang/test/Frontend/macro_defined_type.cpp @@ -19,3 +19,7 @@ struct A { _LIBCPP_FLOAT_ABI int operator()() throw(); // expected-warning{{'pcs' calling convention is not supported for this target}} }; + +// Added test for fix for PR43315 +#define a __attribute__((__cdecl__, __regparm__(0))) +int(a b)();