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 <rdar://problem/8986308> (a libc++ SFINAE issue) and the Boost.Polygon failure. llvm-svn: 127150
This commit is contained in:
parent
ac55c79dd6
commit
43f788f16c
|
@ -4513,19 +4513,32 @@ TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
|
|||
|
||||
// Copy information relevant to the template specialization.
|
||||
TemplateSpecializationTypeLoc NamedTL
|
||||
= TLB.push<TemplateSpecializationTypeLoc>(NamedT);
|
||||
= TLB.push<TemplateSpecializationTypeLoc>(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<ElaboratedTypeLoc>(Result);
|
||||
NewTL.setKeywordLoc(TL.getKeywordLoc());
|
||||
NewTL.setQualifierLoc(QualifierLoc);
|
||||
} else if (isa<DependentTemplateSpecializationType>(Result)) {
|
||||
DependentTemplateSpecializationTypeLoc SpecTL
|
||||
= TLB.push<DependentTemplateSpecializationTypeLoc>(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<TemplateSpecializationTypeLoc>(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;
|
||||
}
|
||||
|
|
|
@ -215,3 +215,47 @@ namespace PR8489 {
|
|||
c.F(); // expected-error{{no matching member function}}
|
||||
}
|
||||
}
|
||||
|
||||
namespace rdar8986308 {
|
||||
template <bool> struct __static_assert_test;
|
||||
template <> struct __static_assert_test<true> {};
|
||||
template <unsigned> struct __static_assert_check {};
|
||||
|
||||
namespace std {
|
||||
|
||||
template <class _Tp, class _Up>
|
||||
struct __has_rebind
|
||||
{
|
||||
private:
|
||||
struct __two {char _; char __;};
|
||||
template <class _Xp> static __two __test(...);
|
||||
template <class _Xp> static char __test(typename _Xp::template rebind<_Up>* = 0);
|
||||
public:
|
||||
static const bool value = sizeof(__test<_Tp>(0)) == 1;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
template <class T> struct B1 {};
|
||||
|
||||
template <class T>
|
||||
struct B
|
||||
{
|
||||
template <class U> struct rebind {typedef B1<U> other;};
|
||||
};
|
||||
|
||||
template <class T, class U> struct D1 {};
|
||||
|
||||
template <class T, class U>
|
||||
struct D
|
||||
{
|
||||
template <class V> struct rebind {typedef D1<V, U> other;};
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
typedef __static_assert_check<sizeof(__static_assert_test<((std::__has_rebind<B<int>, double>::value))>)> __t64;
|
||||
typedef __static_assert_check<sizeof(__static_assert_test<((std::__has_rebind<D<char, int>, double>::value))>)> __t64;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue