r239575 - [modules] Fix crash with multiple levels of default template argument merging.

Richard Smith richard-llvm at metafoo.co.uk
Thu Jun 11 16:46:11 PDT 2015


Author: rsmith
Date: Thu Jun 11 18:46:11 2015
New Revision: 239575

URL: http://llvm.org/viewvc/llvm-project?rev=239575&view=rev
Log:
[modules] Fix crash with multiple levels of default template argument merging.

Modified:
    cfe/trunk/include/clang/AST/DeclTemplate.h
    cfe/trunk/test/Modules/Inputs/submodules-merge-defs/defs.h
    cfe/trunk/test/Modules/submodules-merge-defs.cpp

Modified: cfe/trunk/include/clang/AST/DeclTemplate.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclTemplate.h?rev=239575&r1=239574&r2=239575&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/DeclTemplate.h (original)
+++ cfe/trunk/include/clang/AST/DeclTemplate.h Thu Jun 11 18:46:11 2015
@@ -265,7 +265,7 @@ public:
     const DefaultArgStorage *Storage = this;
     if (auto *Prev = ValueOrInherited.template dyn_cast<ParmDecl*>())
       Storage = &Prev->getDefaultArgStorage();
-    if (auto *C = ValueOrInherited.template dyn_cast<Chain*>())
+    if (auto *C = Storage->ValueOrInherited.template dyn_cast<Chain*>())
       return C->Value;
     return Storage->ValueOrInherited.template get<ArgType>();
   }

Modified: cfe/trunk/test/Modules/Inputs/submodules-merge-defs/defs.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/submodules-merge-defs/defs.h?rev=239575&r1=239574&r2=239575&view=diff
==============================================================================
--- cfe/trunk/test/Modules/Inputs/submodules-merge-defs/defs.h (original)
+++ cfe/trunk/test/Modules/Inputs/submodules-merge-defs/defs.h Thu Jun 11 18:46:11 2015
@@ -46,6 +46,7 @@ namespace G {
 
 template<typename T = int, int N = 3, template<typename> class K = F> int H(int a = 1);
 template<typename T = int, int N = 3, template<typename> class K = F> using I = decltype(H<T, N, K>());
+template<typename T = int, int N = 3, template<typename> class K = F> struct J {};
 
 namespace NS {
   struct A {};

Modified: cfe/trunk/test/Modules/submodules-merge-defs.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/submodules-merge-defs.cpp?rev=239575&r1=239574&r2=239575&view=diff
==============================================================================
--- cfe/trunk/test/Modules/submodules-merge-defs.cpp (original)
+++ cfe/trunk/test/Modules/submodules-merge-defs.cpp Thu Jun 11 18:46:11 2015
@@ -40,6 +40,9 @@ int pre_ff = F<int>().f(); // expected-e
 int pre_fg = F<int>().g<int>(); // expected-error +{{must be imported}}
 // expected-note at defs.h:26 +{{here}}
 
+J<> pre_j; // expected-error {{must be imported}} expected-error {{too few}}
+// expected-note at defs.h:49 +{{here}}
+
 // Make definitions from second module visible.
 #ifdef TEXTUAL
 #include "import-and-redefine.h"
@@ -65,3 +68,6 @@ int post_fg = F<char>().g<int>();
 // expected-error at -5 {{no matching member function}}
 // expected-note at defs.h:34 {{substitution failure}}
 #endif
+J<> post_j;
+template<typename T, int N, template<typename> class K> struct J;
+J<> post_j2;





More information about the cfe-commits mailing list