summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNico Weber <nicolasweber@gmx.de>2014-12-30 02:06:40 +0000
committerNico Weber <nicolasweber@gmx.de>2014-12-30 02:06:40 +0000
commit8d26b72aca165c3d9d97fce44973953600d196e5 (patch)
tree883a1f70a08189de70fc255c6bdeb8c97df2d417
parent81aef1bd52b4d9cf1210077045333cc29ed29497 (diff)
downloadbcm5719-llvm-8d26b72aca165c3d9d97fce44973953600d196e5.tar.gz
bcm5719-llvm-8d26b72aca165c3d9d97fce44973953600d196e5.zip
Don't crash on an invalid trailing return type on a function before a '...'
clang tries to produce a helpful diagnostic for the traiilng '...', but the code that r216778 added for this doesn't expect an invalid trailing return type. Add code to explicitly handle this. Having explicit code for this but not for other things looks a bit strange, but trailing return types are special in that they have a separate existence bit in addition to the type (see r158348). llvm-svn: 224974
-rw-r--r--clang/lib/Sema/SemaTemplateVariadic.cpp10
-rw-r--r--clang/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p13.cpp4
2 files changed, 9 insertions, 5 deletions
diff --git a/clang/lib/Sema/SemaTemplateVariadic.cpp b/clang/lib/Sema/SemaTemplateVariadic.cpp
index f5883e429db..e4fab71d995 100644
--- a/clang/lib/Sema/SemaTemplateVariadic.cpp
+++ b/clang/lib/Sema/SemaTemplateVariadic.cpp
@@ -782,11 +782,11 @@ bool Sema::containsUnexpandedParameterPacks(Declarator &D) {
Chunk.Fun.NoexceptExpr->containsUnexpandedParameterPack())
return true;
- if (Chunk.Fun.hasTrailingReturnType() &&
- Chunk.Fun.getTrailingReturnType()
- .get()
- ->containsUnexpandedParameterPack())
- return true;
+ if (Chunk.Fun.hasTrailingReturnType()) {
+ QualType T = Chunk.Fun.getTrailingReturnType().get();
+ if (!T.isNull() && T->containsUnexpandedParameterPack())
+ return true;
+ }
break;
case DeclaratorChunk::MemberPointer:
diff --git a/clang/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p13.cpp b/clang/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p13.cpp
index 93c246bdd79..de1c5a708db 100644
--- a/clang/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p13.cpp
+++ b/clang/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p13.cpp
@@ -68,6 +68,10 @@ void ci(int ... []); // expected-error{{type 'int []' of function parameter pack
void di(int ... x[]); // expected-error{{type 'int []' of function parameter pack does not contain any unexpanded parameter packs}}
}
+void f5a(auto fp(int)->unk ...) {} // expected-error{{unknown type name 'unk'}}
+void f5b(auto fp(int)->auto ...) {} // expected-error{{'auto' not allowed in function return type}}
+void f5c(auto fp()->...) {} // expected-error{{expected a type}}
+
// FIXME: Expand for function and member pointer types.
OpenPOWER on IntegriCloud