diff options
author | Anders Carlsson <andersca@mac.com> | 2009-09-15 07:42:44 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-09-15 07:42:44 +0000 |
commit | aac6e3a6bbca5952263648e70cbd56d9f89cf4a2 (patch) | |
tree | 9b748acb8ead0bec25d3bb8fabdc80f70f8230e0 | |
parent | f6c213a931f8eedf91531f3204cc828f18466fd5 (diff) |
If a conversion operator exists in a base class, make sure to cast the object to that base class.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@81852 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaExprCXX.cpp | 8 | ||||
-rw-r--r-- | test/CodeGenCXX/conversion-function.cpp | 2 |
2 files changed, 9 insertions, 1 deletions
diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp index a8546dd5ee..ec7b2c8e7f 100644 --- a/lib/Sema/SemaExprCXX.cpp +++ b/lib/Sema/SemaExprCXX.cpp @@ -1991,9 +1991,15 @@ Sema::OwningExprResult Sema::BuildCXXCastArgument(SourceLocation CastLoc, } case CastExpr::CK_UserDefinedConversion: { + assert(!From->getType()->isPointerType() && "Arg can't have pointer type!"); + + // Cast to base if needed. + if (PerformObjectArgumentInitialization(From, Method)) + return ExprError(); + // Create an implicit member expr to refer to the conversion operator. MemberExpr *ME = - new (Context) MemberExpr(From, From->getType()->isPointerType(), Method, + new (Context) MemberExpr(From, /*IsArrow=*/false, Method, SourceLocation(), Method->getType()); diff --git a/test/CodeGenCXX/conversion-function.cpp b/test/CodeGenCXX/conversion-function.cpp index e5f303cbae..0bfd4af7e2 100644 --- a/test/CodeGenCXX/conversion-function.cpp +++ b/test/CodeGenCXX/conversion-function.cpp @@ -79,11 +79,13 @@ int main() { // Test. Conversion in base class is visible in derived class. class XB { + int a; public: operator int(); }; class Yb : public XB { + double b; public: operator char(); }; |