summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Gesiak <modocache@gmail.com>2019-01-07 03:25:59 +0000
committerBrian Gesiak <modocache@gmail.com>2019-01-07 03:25:59 +0000
commit7dda73a223c2c2bc48ba37f2cc3c1fd7b976c186 (patch)
tree9945c9e80c3272eead4c3e5ff83781f02fe477d0
parenta3077e6fb6138bdd785e097abced53e5728e200a (diff)
downloadbcm5719-llvm-7dda73a223c2c2bc48ba37f2cc3c1fd7b976c186.tar.gz
bcm5719-llvm-7dda73a223c2c2bc48ba37f2cc3c1fd7b976c186.zip
[SemaCXX] Fix ICE for unexpanded parameter pack
Summary: The documentation for RecursiveASTVisitor::TraverseDecl states that the Decl being traversed may be null. In fact, this is the case when a CXXCatchStmt with no exception decl is traversed. Because the visitor for diagnosing unexpanded parameter packs does not check for null, it ends up crashing when it attempts to call the Decl::isParameterPack method on a null Decl pointer. Add a null check to prevent an ICE, and a test case that would crash otherwise. Also, because the test requires C++ exceptions and C++14, change the test parameters for the entire test file. (Alternatively, I thought about adding a new test file, but went with this approach for my own convenience.) Co-authored-by: Andreas Molzer <andreas.molzer@gmx.de> Co-authored-by: Mara Bos <m-ou.se@m-ou.se> Reviewers: rsmith Reviewed By: rsmith Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D56271 llvm-svn: 350501
-rw-r--r--clang/lib/Sema/SemaTemplateVariadic.cpp2
-rw-r--r--clang/test/SemaCXX/alias-template.cpp6
2 files changed, 6 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaTemplateVariadic.cpp b/clang/lib/Sema/SemaTemplateVariadic.cpp
index 3338cec5eb1..0e7fc20d248 100644
--- a/clang/lib/Sema/SemaTemplateVariadic.cpp
+++ b/clang/lib/Sema/SemaTemplateVariadic.cpp
@@ -164,7 +164,7 @@ namespace {
// A function parameter pack is a pack expansion, so cannot contain
// an unexpanded parameter pack. Likewise for a template parameter
// pack that contains any references to other packs.
- if (D->isParameterPack())
+ if (D && D->isParameterPack())
return true;
return inherited::TraverseDecl(D);
diff --git a/clang/test/SemaCXX/alias-template.cpp b/clang/test/SemaCXX/alias-template.cpp
index f2ba04df78a..0a92b9dd963 100644
--- a/clang/test/SemaCXX/alias-template.cpp
+++ b/clang/test/SemaCXX/alias-template.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -verify -std=c++11 %s
+// RUN: %clang_cc1 -verify -std=c++14 -fcxx-exceptions %s
namespace RedeclAliasTypedef {
template<typename U> using T = int;
@@ -189,3 +189,7 @@ int sfinae_me() { return 0; } // expected-note{{candidate template ignored: subs
int g = sfinae_me<int>(); // expected-error{{no matching function for call to 'sfinae_me'}}
}
+
+namespace NullExceptionDecl {
+template<int... I> auto get = []() { try { } catch(...) {}; return I; }; // expected-error{{initializer contains unexpanded parameter pack 'I'}}
+}
OpenPOWER on IntegriCloud