Fix determination of whether one set of cvr-qualifiers is compatible

with another in template argument deduction.

We happened to typically get away with getting this wrong, because the
cases where we'd produce a bogus deduction were caught by the final
"deduced A is compatible with A" check.

llvm-svn: 336852
This commit is contained in:
Richard Smith 2018-07-11 21:07:04 +00:00
parent 5bfbae5cb1
commit 34c325028a
2 changed files with 16 additions and 6 deletions

View File

@ -1019,8 +1019,10 @@ DeduceTemplateArguments(Sema &S,
return Sema::TDK_Success;
}
/// Determine whether the parameter has qualifiers that are either
/// inconsistent with or a superset of the argument's qualifiers.
/// Determine whether the parameter has qualifiers that the argument
/// lacks. Put another way, determine whether there is no way to add
/// a deduced set of qualifiers to the ParamType that would result in
/// its qualifiers matching those of the ArgType.
static bool hasInconsistentOrSupersetQualifiersOf(QualType ParamType,
QualType ArgType) {
Qualifiers ParamQs = ParamType.getQualifiers();
@ -1044,10 +1046,8 @@ static bool hasInconsistentOrSupersetQualifiersOf(QualType ParamType,
ParamQs.hasObjCLifetime())
return true;
// CVR qualifier superset.
return (ParamQs.getCVRQualifiers() != ArgQs.getCVRQualifiers()) &&
((ParamQs.getCVRQualifiers() | ArgQs.getCVRQualifiers())
== ParamQs.getCVRQualifiers());
// CVR qualifiers inconsistent or a superset.
return (ParamQs.getCVRQualifiers() & ~ArgQs.getCVRQualifiers()) != 0;
}
/// Compare types for equality with respect to possibly compatible

View File

@ -0,0 +1,10 @@
// RUN: %clang_cc1 -verify %s
// an attempt is made to find template argument values that will make P, after
// substitution of the deduced values, compatible with A
namespace cv_mismatch {
template<typename> struct X {};
template<typename T> void f(X<const T>); // expected-note {{cannot deduce a type for 'T' that would make 'const T' equal 'volatile int'}}
void g() { f(X<volatile int>()); } // expected-error {{no matching}}
}