]> granicus.if.org Git - clang/commitdiff
<rdar://problem/13140795> Transform the scope type of a pseudo-destructor expression...
authorDouglas Gregor <dgregor@apple.com>
Fri, 8 Mar 2013 21:25:01 +0000 (21:25 +0000)
committerDouglas Gregor <dgregor@apple.com>
Fri, 8 Mar 2013 21:25:01 +0000 (21:25 +0000)
We were transforming the scope type of a pseudo-destructor expression
(e.g., the first T in x->T::~T()) as a freestanding type, which meant
that dependent template specialization types here would stay dependent
even when no template parameters were named. This would eventually
mean that a dependent expression would end up in what should be
fully-instantiated ASTs, causing IRgen to assert.

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

lib/Sema/TreeTransform.h
test/SemaTemplate/destructor-template.cpp

index 66bf4cea68ec273b2d255c913bbe24d88836a2fd..c2dcf748c06300337416c3dd727ed3b6098ad8c7 100644 (file)
@@ -7459,7 +7459,9 @@ TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
 
   TypeSourceInfo *ScopeTypeInfo = 0;
   if (E->getScopeTypeInfo()) {
-    ScopeTypeInfo = getDerived().TransformType(E->getScopeTypeInfo());
+    CXXScopeSpec EmptySS;
+    ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
+                      E->getScopeTypeInfo(), ObjectType, 0, EmptySS);
     if (!ScopeTypeInfo)
       return ExprError();
   }
index 07beda40aaa7484566afbdf1629f05c09154e473..6806c24a84ebafeb0177ea2ac69ceeab75277122 100644 (file)
@@ -57,3 +57,22 @@ namespace PR7904 {
   };
   Foo f;
 }
+
+namespace rdar13140795 {
+  template <class T> class shared_ptr {};
+
+  template <typename T> struct Marshal {
+    static int gc();
+  };
+
+
+  template <typename T> int Marshal<T>::gc() {
+    shared_ptr<T> *x;
+    x->template shared_ptr<T>::~shared_ptr();
+    return 0;
+  }
+
+  void test() {
+    Marshal<int>::gc();
+  }
+}