]> granicus.if.org Git - clang/commitdiff
If a conversion operator exists in a base class, make sure to cast the object to...
authorAnders Carlsson <andersca@mac.com>
Tue, 15 Sep 2009 07:42:44 +0000 (07:42 +0000)
committerAnders Carlsson <andersca@mac.com>
Tue, 15 Sep 2009 07:42:44 +0000 (07:42 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@81852 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaExprCXX.cpp
test/CodeGenCXX/conversion-function.cpp

index a8546dd5eed41d21a9daaaecd4b360fdee176a3c..ec7b2c8e7f425c330ce0aecc01c3d5710a5f0cf1 100644 (file)
@@ -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());
     
 
index e5f303cbaeeff724131e5f42d630e438fbbd7bc5..0bfd4af7e265e2b30af02ef036125daa283b4bac 100644 (file)
@@ -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();
 };