forked from OSchip/llvm-project
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:
parent
5bfbae5cb1
commit
34c325028a
|
@ -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
|
||||
|
|
|
@ -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}}
|
||||
}
|
Loading…
Reference in New Issue