diff options
-rw-r--r-- | lib/Sema/TreeTransform.h | 14 | ||||
-rw-r--r-- | test/SemaTemplate/dependent-template-recover.cpp | 42 |
2 files changed, 50 insertions, 6 deletions
diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index 76792a0c76..9eb7d63505 100644 --- a/lib/Sema/TreeTransform.h +++ b/lib/Sema/TreeTransform.h @@ -498,7 +498,8 @@ public: QualType TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL, - TemplateName Template); + TemplateName Template, + CXXScopeSpec &SS); QualType TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, @@ -3103,7 +3104,8 @@ TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, Result = getDerived().TransformDependentTemplateSpecializationType(TLB, SpecTL, - Template); + Template, + SS); } else { // Nothing special needs to be done for these. Result = getDerived().TransformType(TLB, TL); @@ -3159,7 +3161,8 @@ TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, Result = getDerived().TransformDependentTemplateSpecializationType(TLB, SpecTL, - Template); + Template, + SS); } else { // Nothing special needs to be done for these. Result = getDerived().TransformType(TLB, TL); @@ -4245,7 +4248,8 @@ template <typename Derived> QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL, - TemplateName Template) { + TemplateName Template, + CXXScopeSpec &SS) { TemplateArgumentListInfo NewTemplateArgs; NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); @@ -4270,8 +4274,6 @@ QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); NewTL.setKeywordLoc(TL.getKeywordLoc()); - CXXScopeSpec SS; - SS.Adopt(TL.getQualifierLoc()); NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); NewTL.setNameLoc(TL.getNameLoc()); NewTL.setLAngleLoc(TL.getLAngleLoc()); diff --git a/test/SemaTemplate/dependent-template-recover.cpp b/test/SemaTemplate/dependent-template-recover.cpp index e91ffb5253..3c01f6586b 100644 --- a/test/SemaTemplate/dependent-template-recover.cpp +++ b/test/SemaTemplate/dependent-template-recover.cpp @@ -16,3 +16,45 @@ struct X { (*t).f2<0>(); // expected-error{{expected expression}} } }; + +namespace PR9401 { + // From GCC PR c++/45558 + template <typename S, typename T> + struct C + { + template <typename U> + struct B + { + template <typename W> + struct E + { + explicit E(const W &x) : w(x) {} + const W &w; + }; + }; + }; + + struct F; + template <typename X> + struct D + { + D() {} + }; + + const D<F> g; + template <typename S, typename T> + struct A + { + template <typename U> + struct B : C<S, T>::template B<U> + { + typedef typename C<S, T>::template B<U> V; + static const D<typename V::template E<D<F> > > a; + }; + }; + + template <typename S, typename T> + template <typename U> + const D<typename C<S, T>::template B<U>::template E<D<F> > > + A<S, T>::B<U>::a = typename C<S, T>::template B<U>::template E<D<F> >(g); +} |