]> granicus.if.org Git - clang/commitdiff
Fix a fiendinshly fun little type-canonicalization bug, where we were
authorDouglas Gregor <dgregor@apple.com>
Sat, 13 Feb 2010 06:05:33 +0000 (06:05 +0000)
committerDouglas Gregor <dgregor@apple.com>
Sat, 13 Feb 2010 06:05:33 +0000 (06:05 +0000)
rebuilding a typename type terminating in a template-id (with
dependent template name, naturally) as a TypenameType when, because
its context could be fully resolved, we should have been building it
as a QualifiedNameType. Fixes PR6268.

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

lib/Sema/TreeTransform.h
test/SemaTemplate/typename-specifier-4.cpp

index 02dabbb2f589c474ccc91366b8113f019dd9391b..fc069f7ba38ab12e8f64d302363777a586f91565 100644 (file)
@@ -525,9 +525,13 @@ public:
   /// and the given type. Subclasses may override this routine to provide
   /// different behavior.
   QualType RebuildTypenameType(NestedNameSpecifier *NNS, QualType T) {
-    if (NNS->isDependent())
-      return SemaRef.Context.getTypenameType(NNS,
+    if (NNS->isDependent()) {
+      CXXScopeSpec SS;
+      SS.setScopeRep(NNS);
+      if (!SemaRef.computeDeclContext(SS))
+        return SemaRef.Context.getTypenameType(NNS,
                                           cast<TemplateSpecializationType>(T));
+    }
 
     return SemaRef.Context.getQualifiedNameType(NNS, T);
   }
index 9c757c5ad0fd59018fedb959aa36b97614d51137..0a6fef74c340331819c6c969732cf3e7404d9b56 100644 (file)
@@ -80,3 +80,22 @@ namespace PR6236 {
     }
   };
 }
+
+namespace PR6268 {
+  template <typename T>
+  struct Outer {
+    template <typename U>
+    struct Inner {};
+
+    template <typename U>
+    typename Outer<T>::template Inner<U>
+    foo(typename Outer<T>::template Inner<U>);
+  };
+
+  template <typename T>
+  template <typename U>
+  typename Outer<T>::template Inner<U>
+  Outer<T>::foo(typename Outer<T>::template Inner<U>) {
+    return Inner<U>();
+  }
+}