diff options
| author | Douglas Gregor <dgregor@apple.com> | 2009-11-05 00:07:36 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2009-11-05 00:07:36 +0000 |
| commit | 01df946664ff8bcfaefe2b954b1199f590f4cdde (patch) | |
| tree | 624aae4876325bebbe77f433d52984b257ba06e9 | |
| parent | 492ed30a329dd733555d320382eaa9854968ca6a (diff) | |
| download | bcm5719-llvm-01df946664ff8bcfaefe2b954b1199f590f4cdde.tar.gz bcm5719-llvm-01df946664ff8bcfaefe2b954b1199f590f4cdde.zip | |
Make sure to grab CVR qualifiers from the canonical type. ARGH!
llvm-svn: 86079
| -rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 4 | ||||
| -rw-r--r-- | clang/test/SemaCXX/overload-member-call.cpp | 12 | ||||
| -rw-r--r-- | clang/test/SemaTemplate/member-access-expr.cpp | 17 |
3 files changed, 31 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 946e28269eb..dd009a062f0 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -2097,8 +2097,8 @@ Sema::TryObjectArgumentInitialization(Expr *From, CXXMethodDecl *Method) { // First check the qualifiers. We don't care about lvalue-vs-rvalue // with the implicit object parameter (C++ [over.match.funcs]p5). QualType FromTypeCanon = Context.getCanonicalType(FromType); - if (ImplicitParamType.getCVRQualifiers() != FromType.getCVRQualifiers() && - !ImplicitParamType.isAtLeastAsQualifiedAs(FromType)) + if (ImplicitParamType.getCVRQualifiers() != FromTypeCanon.getCVRQualifiers() && + !ImplicitParamType.isAtLeastAsQualifiedAs(FromTypeCanon)) return ICS; // Check that we have either the same type or a derived type. It diff --git a/clang/test/SemaCXX/overload-member-call.cpp b/clang/test/SemaCXX/overload-member-call.cpp index 96e570da654..937b65d633f 100644 --- a/clang/test/SemaCXX/overload-member-call.cpp +++ b/clang/test/SemaCXX/overload-member-call.cpp @@ -54,3 +54,15 @@ void test(X x, const X xc, X* xp, const X* xcp, volatile X xv, volatile X* xvp) X::h(0); // expected-error{{call to non-static member function without an object argument}} } + +struct X1 { + int& member(); + float& member() const; +}; + +struct X2 : X1 { }; + +void test_X2(X2 *x2p, const X2 *cx2p) { + int &ir = x2p->member(); + float &fr = cx2p->member(); +} diff --git a/clang/test/SemaTemplate/member-access-expr.cpp b/clang/test/SemaTemplate/member-access-expr.cpp index 0a6a6bc0990..ad0075f564b 100644 --- a/clang/test/SemaTemplate/member-access-expr.cpp +++ b/clang/test/SemaTemplate/member-access-expr.cpp @@ -88,3 +88,20 @@ protected: (void)f0<0>(); } }; + +// Fun with template instantiation and conversions +struct X4 { + int& member(); + float& member() const; +}; + +template<typename T> +struct X5 { + void f(T* ptr) { int& ir = ptr->member(); } + void g(T* ptr) { float& fr = ptr->member(); } +}; + +void test_X5(X5<X4> x5, X5<const X4> x5c, X4 *xp, const X4 *cxp) { + x5.f(xp); + x5c.g(cxp); +} |

