]> granicus.if.org Git - clang/commitdiff
When substituting in for a template name, do not produce a qualified
authorDouglas Gregor <dgregor@apple.com>
Sat, 5 Mar 2011 20:06:51 +0000 (20:06 +0000)
committerDouglas Gregor <dgregor@apple.com>
Sat, 5 Mar 2011 20:06:51 +0000 (20:06 +0000)
template name as the result of substitution. The qualifier is handled
separately by the tree transformer, so we would end up in an
inconsistent state.

This is actually the last bit of PR9016, and possibly also fixes
PR8965. It takes Boost.Icl from "epic fail" down to a single failure.

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

lib/Sema/SemaTemplateInstantiate.cpp
test/SemaTemplate/issue150.cpp

index 4108e9fd6faeec578ddfe8def99dedae803d3ff2..6fb6ea270b6d2dac7182f8c487af247af94ab406 100644 (file)
@@ -967,6 +967,13 @@ TemplateName TemplateInstantiator::TransformTemplateName(CXXScopeSpec &SS,
       TemplateName Template = Arg.getAsTemplate();
       assert(!Template.isNull() && Template.getAsTemplateDecl() &&
              "Wrong kind of template template argument");
+      
+      // We don't ever want to substitute for a qualified template name, since
+      // the qualifier is handled separately. So, look through the qualified
+      // template name to its underlying declaration.
+      if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
+        Template = TemplateName(QTN->getTemplateDecl());
+          
       return Template;
     }
   }
index 6124d05413a3bdd1eaea1cda167ac782b39a9966..af3b93c907c1418ff48fcf9bcc04b407c9b4276f 100644 (file)
@@ -83,7 +83,7 @@ namespace PR9016 {
   };
 
   template <class T,
-            template<class _T, template<class> class Compare = less,
+            template<class _T, template<class> class Compare = PR9016::less,
                      class = typename interval_type_default<_T,Compare>::type,
                      template<class> class = allocator> class IntervalSet>
   struct ZZZ
@@ -92,7 +92,7 @@ namespace PR9016 {
   };
   
   template <class T, 
-            template<class _T, template<class> class Compare = less,
+            template<class _T, template<class> class Compare = PR9016::less,
                      class = typename interval_type_default<_T,Compare>::type,
                      template<class> class = allocator> class IntervalSet>
   void int40()