This revision was automatically updated to reflect the committed changes. Closed by commit rL293732: clang-cl: Evaluate arguments left-to-right in constructor call with initializer… (authored by hans).
Changed prior to commit: https://reviews.llvm.org/D29350?vs=86496&id=86549#toc Repository: rL LLVM https://reviews.llvm.org/D29350 Files: cfe/trunk/lib/CodeGen/CGClass.cpp cfe/trunk/test/CodeGenCXX/initializer-list-ctor-order.cpp Index: cfe/trunk/lib/CodeGen/CGClass.cpp =================================================================== --- cfe/trunk/lib/CodeGen/CGClass.cpp +++ cfe/trunk/lib/CodeGen/CGClass.cpp @@ -1950,7 +1950,11 @@ // Add the rest of the user-supplied arguments. const FunctionProtoType *FPT = D->getType()->castAs<FunctionProtoType>(); - EmitCallArgs(Args, FPT, E->arguments(), E->getConstructor()); + EvaluationOrder Order = E->isListInitialization() + ? EvaluationOrder::ForceLeftToRight + : EvaluationOrder::Default; + EmitCallArgs(Args, FPT, E->arguments(), E->getConstructor(), + /*ParamsToSkip*/ 0, Order); EmitCXXConstructorCall(D, Type, ForVirtualBase, Delegating, This, Args); } Index: cfe/trunk/test/CodeGenCXX/initializer-list-ctor-order.cpp =================================================================== --- cfe/trunk/test/CodeGenCXX/initializer-list-ctor-order.cpp +++ cfe/trunk/test/CodeGenCXX/initializer-list-ctor-order.cpp @@ -0,0 +1,29 @@ +// RUN: %clang_cc1 -std=c++11 %s -emit-llvm -o - -triple %itanium_abi_triple | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-ITANIUM +// RUN: %clang_cc1 -std=c++11 %s -emit-llvm -o - -triple i686-windows | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-MS + +extern "C" { +int f(); +int g(); +} + +struct A { + A(int, int); +}; + + +void foo() { + A a{f(), g()}; +} +// CHECK-ITANIUM-LABEL: define void @_Z3foov +// CHECK-MS-LABEL: define void @"\01?foo@@YAXXZ" +// CHECK: call i32 @f() +// CHECK: call i32 @g() + +struct B : A { + B(); +}; +B::B() : A{f(), g()} {} +// CHECK-ITANIUM-LABEL: define void @_ZN1BC2Ev +// CHECK-MS-LABEL: define x86_thiscallcc %struct.B* @"\01??0B@@QAE@XZ" +// CHECK: call i32 @f() +// CHECK: call i32 @g()
Index: cfe/trunk/lib/CodeGen/CGClass.cpp =================================================================== --- cfe/trunk/lib/CodeGen/CGClass.cpp +++ cfe/trunk/lib/CodeGen/CGClass.cpp @@ -1950,7 +1950,11 @@ // Add the rest of the user-supplied arguments. const FunctionProtoType *FPT = D->getType()->castAs<FunctionProtoType>(); - EmitCallArgs(Args, FPT, E->arguments(), E->getConstructor()); + EvaluationOrder Order = E->isListInitialization() + ? EvaluationOrder::ForceLeftToRight + : EvaluationOrder::Default; + EmitCallArgs(Args, FPT, E->arguments(), E->getConstructor(), + /*ParamsToSkip*/ 0, Order); EmitCXXConstructorCall(D, Type, ForVirtualBase, Delegating, This, Args); } Index: cfe/trunk/test/CodeGenCXX/initializer-list-ctor-order.cpp =================================================================== --- cfe/trunk/test/CodeGenCXX/initializer-list-ctor-order.cpp +++ cfe/trunk/test/CodeGenCXX/initializer-list-ctor-order.cpp @@ -0,0 +1,29 @@ +// RUN: %clang_cc1 -std=c++11 %s -emit-llvm -o - -triple %itanium_abi_triple | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-ITANIUM +// RUN: %clang_cc1 -std=c++11 %s -emit-llvm -o - -triple i686-windows | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-MS + +extern "C" { +int f(); +int g(); +} + +struct A { + A(int, int); +}; + + +void foo() { + A a{f(), g()}; +} +// CHECK-ITANIUM-LABEL: define void @_Z3foov +// CHECK-MS-LABEL: define void @"\01?foo@@YAXXZ" +// CHECK: call i32 @f() +// CHECK: call i32 @g() + +struct B : A { + B(); +}; +B::B() : A{f(), g()} {} +// CHECK-ITANIUM-LABEL: define void @_ZN1BC2Ev +// CHECK-MS-LABEL: define x86_thiscallcc %struct.B* @"\01??0B@@QAE@XZ" +// CHECK: call i32 @f() +// CHECK: call i32 @g()
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits