summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLeonard Chan <leonardchan@google.com>2019-05-10 18:05:15 +0000
committerLeonard Chan <leonardchan@google.com>2019-05-10 18:05:15 +0000
commitdc5d9759063a4eccacdcaeb2b3ac3e157584e63f (patch)
treef89bf1b46738b9bf06211c1ca735bb68f1729538
parentd5d4df98bb9e0c836cb5b229b3f186637cde7673 (diff)
downloadbcm5719-llvm-dc5d9759063a4eccacdcaeb2b3ac3e157584e63f.tar.gz
bcm5719-llvm-dc5d9759063a4eccacdcaeb2b3ac3e157584e63f.zip
Fix and test for assertion error in P41835.
llvm-svn: 360448
-rw-r--r--clang/lib/AST/ASTContext.cpp6
-rw-r--r--clang/test/Frontend/macro_defined_type.cpp6
2 files changed, 12 insertions, 0 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index 1b9b7cd1b51..a2de53ca0c1 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -2758,6 +2758,12 @@ QualType ASTContext::getFunctionTypeWithExceptionSpec(
return getParenType(
getFunctionTypeWithExceptionSpec(PT->getInnerType(), ESI));
+ // Might be wrapped in a macro qualified type.
+ if (const auto *MQT = dyn_cast<MacroQualifiedType>(Orig))
+ return getMacroQualifiedType(
+ getFunctionTypeWithExceptionSpec(MQT->getUnderlyingType(), ESI),
+ MQT->getMacroIdentifier());
+
// Might have a calling-convention attribute.
if (const auto *AT = dyn_cast<AttributedType>(Orig))
return getAttributedType(
diff --git a/clang/test/Frontend/macro_defined_type.cpp b/clang/test/Frontend/macro_defined_type.cpp
index 4e60c840382..63495268687 100644
--- a/clang/test/Frontend/macro_defined_type.cpp
+++ b/clang/test/Frontend/macro_defined_type.cpp
@@ -13,3 +13,9 @@ void Func() {
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 test for fix for P41835
+#define _LIBCPP_FLOAT_ABI __attribute__((pcs("aapcs")))
+struct A {
+ _LIBCPP_FLOAT_ABI int operator()() throw(); // expected-warning{{'pcs' calling convention ignored for this target}}
+};
OpenPOWER on IntegriCloud