aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2009-09-15 07:42:44 +0000
committerAnders Carlsson <andersca@mac.com>2009-09-15 07:42:44 +0000
commitaac6e3a6bbca5952263648e70cbd56d9f89cf4a2 (patch)
tree9b748acb8ead0bec25d3bb8fabdc80f70f8230e0
parentf6c213a931f8eedf91531f3204cc828f18466fd5 (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.cpp8
-rw-r--r--test/CodeGenCXX/conversion-function.cpp2
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();
};