forked from OSchip/llvm-project
Fix a thinko in the qualification-conversion check when the qualificaitons are disjoint, and add some overloading-based tests of qualification conversions
llvm-svn: 57942
This commit is contained in:
parent
293a3c6778
commit
ea2d4211e5
|
@ -178,7 +178,7 @@ public:
|
||||||
bool isAtLeastAsQualifiedAs(QualType Other) const {
|
bool isAtLeastAsQualifiedAs(QualType Other) const {
|
||||||
unsigned MyQuals = this->getCVRQualifiers();
|
unsigned MyQuals = this->getCVRQualifiers();
|
||||||
unsigned OtherQuals = Other.getCVRQualifiers();
|
unsigned OtherQuals = Other.getCVRQualifiers();
|
||||||
return MyQuals | OtherQuals == MyQuals;
|
return (MyQuals | OtherQuals) == MyQuals;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// operator==/!= - Indicate whether the specified types and qualifiers are
|
/// operator==/!= - Indicate whether the specified types and qualifiers are
|
||||||
|
|
|
@ -685,7 +685,7 @@ Sema::IsQualificationConversion(QualType FromType, QualType ToType)
|
||||||
|
|
||||||
// -- for every j > 0, if const is in cv 1,j then const is in cv
|
// -- for every j > 0, if const is in cv 1,j then const is in cv
|
||||||
// 2,j, and similarly for volatile.
|
// 2,j, and similarly for volatile.
|
||||||
if (FromType.isMoreQualifiedThan(ToType))
|
if (!ToType.isAtLeastAsQualifiedAs(FromType))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// -- if the cv 1,j and cv 2,j are different, then const is in
|
// -- if the cv 1,j and cv 2,j are different, then const is in
|
||||||
|
|
|
@ -135,3 +135,32 @@ void test_multiparm(long lv, short sv, int iv) {
|
||||||
double* dp2 = multiparm(iv, sv, sv);
|
double* dp2 = multiparm(iv, sv, sv);
|
||||||
multiparm(sv, sv, lv); // expected-error {{ call to 'multiparm' is ambiguous; candidates are: }}
|
multiparm(sv, sv, lv); // expected-error {{ call to 'multiparm' is ambiguous; candidates are: }}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test overloading based on qualification vs. no qualification
|
||||||
|
// conversion.
|
||||||
|
int* quals1(int const * p);
|
||||||
|
char* quals1(int * p);
|
||||||
|
|
||||||
|
int* quals2(int const * const * pp);
|
||||||
|
char* quals2(int * * pp);
|
||||||
|
|
||||||
|
int* quals3(int const * * const * ppp);
|
||||||
|
char* quals3(int *** ppp);
|
||||||
|
|
||||||
|
void test_quals(int * p, int * * pp, int * * * ppp) {
|
||||||
|
char* q1 = quals1(p);
|
||||||
|
char* q2 = quals2(pp);
|
||||||
|
char* q3 = quals3(ppp);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test overloading based on qualification ranking (C++ 13.3.2)p3.
|
||||||
|
int* quals_rank1(int const * p);
|
||||||
|
float* quals_rank1(int const volatile *p);
|
||||||
|
|
||||||
|
int* quals_rank2(int const * const * pp);
|
||||||
|
float* quals_rank2(int * const * pp);
|
||||||
|
|
||||||
|
void test_quals_ranking(int * p, int volatile *pq, int * * pp, int * * * ppp) {
|
||||||
|
// int* q1 = quals_rank1(p);
|
||||||
|
float* q2 = quals_rank1(pq);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue