diff options
| -rw-r--r-- | clang/lib/CodeGen/Mangle.cpp | 13 | ||||
| -rw-r--r-- | clang/test/CodeGenCXX/mangle-template.cpp | 19 | 
2 files changed, 31 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/Mangle.cpp b/clang/lib/CodeGen/Mangle.cpp index 55185cb92d0..fd9a1bab7f2 100644 --- a/clang/lib/CodeGen/Mangle.cpp +++ b/clang/lib/CodeGen/Mangle.cpp @@ -1369,7 +1369,18 @@ void CXXNameMangler::mangleExpression(const Expr *E) {    case Expr::DependentScopeDeclRefExprClass: {      const DependentScopeDeclRefExpr *DRE = cast<DependentScopeDeclRefExpr>(E); -    const Type *QTy = DRE->getQualifier()->getAsType(); +    NestedNameSpecifier *NNS = DRE->getQualifier(); +    const Type *QTy = NNS->getAsType(); + +    // When we're dealing with a nested-name-specifier that has just a +    // dependent identifier in it, mangle that as a typename.  FIXME: +    // It isn't clear that we ever actually want to have such a +    // nested-name-specifier; why not just represent it as a typename type? +    if (!QTy && NNS->getAsIdentifier() && NNS->getPrefix()) { +      QTy = getASTContext().getTypenameType(NNS->getPrefix(), +                                            NNS->getAsIdentifier()) +              .getTypePtr(); +    }      assert(QTy && "Qualifier was not type!");      // ::= sr <type> <unqualified-name>                   # dependent name diff --git a/clang/test/CodeGenCXX/mangle-template.cpp b/clang/test/CodeGenCXX/mangle-template.cpp index 38b4bfa38a6..57f30a762ed 100644 --- a/clang/test/CodeGenCXX/mangle-template.cpp +++ b/clang/test/CodeGenCXX/mangle-template.cpp @@ -85,3 +85,22 @@ namespace test7 {    // CHECK: define void @_ZN5test71XIiEC1IdEEPT_PNS_5int_cIXplL_ZNS_4metaIiE5valueEEsrNS6_IS3_EE5valueEE4typeE    template X<int>::X(double*, float*);  } + +namespace test8 { +  template<typename T> +  struct meta { +    struct type { +      static const unsigned value = sizeof(T); +    }; +  }; + +  template<unsigned> struct int_c {  +    typedef float type; +  }; + +  template<typename T> +  void f(int_c<meta<T>::type::value>) { } + +  // CHECK: define void @_ZN5test81fIiEEvNS_5int_cIXsrNS_4metaIT_E4typeE5valueEEE +  template void f<int>(int_c<sizeof(int)>); +}  | 

