diff options
author | Douglas Gregor <dgregor@apple.com> | 2008-10-22 00:38:21 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2008-10-22 00:38:21 +0000 |
commit | ea2d4211e5a7a8823f19d9643a3d85ea76efee95 (patch) | |
tree | 67a6f16b7f1d19fb011ab99f35124c5932b44f7a | |
parent | 293a3c6778b17139835859aab45fd576bf9dc773 (diff) | |
download | bcm5719-llvm-ea2d4211e5a7a8823f19d9643a3d85ea76efee95.tar.gz bcm5719-llvm-ea2d4211e5a7a8823f19d9643a3d85ea76efee95.zip |
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
-rw-r--r-- | clang/include/clang/AST/Type.h | 2 | ||||
-rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 2 | ||||
-rw-r--r-- | clang/test/SemaCXX/overload-call.cpp | 29 |
3 files changed, 31 insertions, 2 deletions
diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h index b11f7112558..07eae4427ac 100644 --- a/clang/include/clang/AST/Type.h +++ b/clang/include/clang/AST/Type.h @@ -178,7 +178,7 @@ public: bool isAtLeastAsQualifiedAs(QualType Other) const { unsigned MyQuals = this->getCVRQualifiers(); unsigned OtherQuals = Other.getCVRQualifiers(); - return MyQuals | OtherQuals == MyQuals; + return (MyQuals | OtherQuals) == MyQuals; } /// operator==/!= - Indicate whether the specified types and qualifiers are diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 2696c985231..6d01709c5b0 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -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 // 2,j, and similarly for volatile. - if (FromType.isMoreQualifiedThan(ToType)) + if (!ToType.isAtLeastAsQualifiedAs(FromType)) return false; // -- if the cv 1,j and cv 2,j are different, then const is in diff --git a/clang/test/SemaCXX/overload-call.cpp b/clang/test/SemaCXX/overload-call.cpp index 311e3d0d3e3..165ee60c84f 100644 --- a/clang/test/SemaCXX/overload-call.cpp +++ b/clang/test/SemaCXX/overload-call.cpp @@ -135,3 +135,32 @@ void test_multiparm(long lv, short sv, int iv) { double* dp2 = multiparm(iv, sv, sv); 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); +} |