forked from OSchip/llvm-project
When performing template argument deduction against a template-id,
only keep deduction results for successful deductions, so that they can be compared against each other. Fixes PR8462, from Richard Smith! llvm-svn: 117983
This commit is contained in:
parent
5c86d22e67
commit
e0f7a8ace9
|
@ -721,6 +721,8 @@ DeduceTemplateArguments(Sema &S,
|
|||
llvm::SmallVector<const RecordType *, 8> ToVisit;
|
||||
ToVisit.push_back(RecordT);
|
||||
bool Successful = false;
|
||||
llvm::SmallVectorImpl<DeducedTemplateArgument> DeducedOrig(0);
|
||||
DeducedOrig = Deduced;
|
||||
while (!ToVisit.empty()) {
|
||||
// Retrieve the next class in the inheritance hierarchy.
|
||||
const RecordType *NextT = ToVisit.back();
|
||||
|
@ -738,9 +740,14 @@ DeduceTemplateArguments(Sema &S,
|
|||
QualType(NextT, 0), Info, Deduced);
|
||||
|
||||
// If template argument deduction for this base was successful,
|
||||
// note that we had some success.
|
||||
if (BaseResult == Sema::TDK_Success)
|
||||
// note that we had some success. Otherwise, ignore any deductions
|
||||
// from this base class.
|
||||
if (BaseResult == Sema::TDK_Success) {
|
||||
Successful = true;
|
||||
DeducedOrig = Deduced;
|
||||
}
|
||||
else
|
||||
Deduced = DeducedOrig;
|
||||
}
|
||||
|
||||
// Visit base classes
|
||||
|
|
|
@ -101,3 +101,25 @@ void test_f4(D d, E e, F f, G g) {
|
|||
C<int, 1> *ci3c = f4c(&g);
|
||||
int *ip1 = f4c(&f);
|
||||
}
|
||||
|
||||
// PR8462
|
||||
namespace N {
|
||||
struct T0;
|
||||
struct T1;
|
||||
|
||||
template<typename X, typename Y> struct B {};
|
||||
|
||||
struct J : B<T0,T0> {};
|
||||
struct K : B<T1,T1> {};
|
||||
|
||||
struct D : J, K {};
|
||||
|
||||
template<typename X, typename Y> void F(B<Y,X>);
|
||||
|
||||
void test()
|
||||
{
|
||||
D d;
|
||||
N::F<T0>(d); // Fails
|
||||
N::F<T1>(d); // OK
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue