]> granicus.if.org Git - clang/commitdiff
[SemaCXX] Fix ICE for unexpanded parameter pack
authorBrian Gesiak <modocache@gmail.com>
Mon, 7 Jan 2019 03:25:59 +0000 (03:25 +0000)
committerBrian Gesiak <modocache@gmail.com>
Mon, 7 Jan 2019 03:25:59 +0000 (03:25 +0000)
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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@350501 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaTemplateVariadic.cpp
test/SemaCXX/alias-template.cpp

index 3338cec5eb158097914a8bb619045c7583289c49..0e7fc20d248715420046e2258818ea31ba1db321 100644 (file)
@@ -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);
index f2ba04df78ae238ef405f9b662a91a64ac8502fb..0a92b9dd9639242bdc80d6c42605601ccb0e6d83 100644 (file)
@@ -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'}}
+}