From: Douglas Gregor Date: Mon, 7 Mar 2011 02:33:33 +0000 (+0000) Subject: When transforming a dependent template specialization type, make sure X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0a0367a479e2ad204a97f87ed72f18209169b775;p=clang When transforming a dependent template specialization type, make sure to set the source-location information for the template arguments to the *transformed* source-location information, not the original source-location information. Fixes (a libc++ SFINAE issue) and the Boost.Polygon failure. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@127150 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index 870f992c6d..cab63d060c 100644 --- a/lib/Sema/TreeTransform.h +++ b/lib/Sema/TreeTransform.h @@ -4513,19 +4513,32 @@ TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, // Copy information relevant to the template specialization. TemplateSpecializationTypeLoc NamedTL - = TLB.push(NamedT); + = TLB.push(NamedT); NamedTL.setLAngleLoc(TL.getLAngleLoc()); NamedTL.setRAngleLoc(TL.getRAngleLoc()); - for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) - NamedTL.setArgLocInfo(I, TL.getArgLocInfo(I)); + for (unsigned I = 0, E = NamedTL.getNumArgs(); I != E; ++I) + NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); // Copy information relevant to the elaborated type. ElaboratedTypeLoc NewTL = TLB.push(Result); NewTL.setKeywordLoc(TL.getKeywordLoc()); NewTL.setQualifierLoc(QualifierLoc); + } else if (isa(Result)) { + DependentTemplateSpecializationTypeLoc SpecTL + = TLB.push(Result); + SpecTL.setQualifierLoc(QualifierLoc); + SpecTL.setLAngleLoc(TL.getLAngleLoc()); + SpecTL.setRAngleLoc(TL.getRAngleLoc()); + SpecTL.setNameLoc(TL.getNameLoc()); + for (unsigned I = 0, E = SpecTL.getNumArgs(); I != E; ++I) + SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); } else { - TypeLoc NewTL(Result, TL.getOpaqueData()); - TLB.pushFullCopy(NewTL); + TemplateSpecializationTypeLoc SpecTL + = TLB.push(Result); + SpecTL.setLAngleLoc(TL.getLAngleLoc()); + SpecTL.setRAngleLoc(TL.getRAngleLoc()); + for (unsigned I = 0, E = SpecTL.getNumArgs(); I != E; ++I) + SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); } return Result; } diff --git a/test/SemaTemplate/instantiate-member-template.cpp b/test/SemaTemplate/instantiate-member-template.cpp index e2f7275618..4c74f5fb93 100644 --- a/test/SemaTemplate/instantiate-member-template.cpp +++ b/test/SemaTemplate/instantiate-member-template.cpp @@ -215,3 +215,47 @@ namespace PR8489 { c.F(); // expected-error{{no matching member function}} } } + +namespace rdar8986308 { + template struct __static_assert_test; + template <> struct __static_assert_test {}; + template struct __static_assert_check {}; + + namespace std { + + template + struct __has_rebind + { + private: + struct __two {char _; char __;}; + template static __two __test(...); + template static char __test(typename _Xp::template rebind<_Up>* = 0); + public: + static const bool value = sizeof(__test<_Tp>(0)) == 1; + }; + + } + + template struct B1 {}; + + template + struct B + { + template struct rebind {typedef B1 other;}; + }; + + template struct D1 {}; + + template + struct D + { + template struct rebind {typedef D1 other;}; + }; + + int main() + { + typedef __static_assert_check, double>::value))>)> __t64; + typedef __static_assert_check, double>::value))>)> __t64; + } + +}