r293732 - clang-cl: Evaluate arguments left-to-right in constructor call with initializer list (PR31831)
Hans Wennborg via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 31 18:21:08 PST 2017
Author: hans
Date: Tue Jan 31 20:21:07 2017
New Revision: 293732
URL: http://llvm.org/viewvc/llvm-project?rev=293732&view=rev
Log:
clang-cl: Evaluate arguments left-to-right in constructor call with initializer list (PR31831)
clang-cl would evaluate the arguments right-to-left (see PR), and for
non-Windows targets I suppose we only got it because we were already
emitting left-to-right in CodeGenFunction::EmitCallArgs.
Differential Revision: https://reviews.llvm.org/D29350
Added:
cfe/trunk/test/CodeGenCXX/initializer-list-ctor-order.cpp
Modified:
cfe/trunk/lib/CodeGen/CGClass.cpp
Modified: cfe/trunk/lib/CodeGen/CGClass.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGClass.cpp?rev=293732&r1=293731&r2=293732&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGClass.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGClass.cpp Tue Jan 31 20:21:07 2017
@@ -1950,7 +1950,11 @@ void CodeGenFunction::EmitCXXConstructor
// 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);
}
Added: cfe/trunk/test/CodeGenCXX/initializer-list-ctor-order.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/initializer-list-ctor-order.cpp?rev=293732&view=auto
==============================================================================
--- cfe/trunk/test/CodeGenCXX/initializer-list-ctor-order.cpp (added)
+++ cfe/trunk/test/CodeGenCXX/initializer-list-ctor-order.cpp Tue Jan 31 20:21:07 2017
@@ -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 at XZ"
+// CHECK: call i32 @f()
+// CHECK: call i32 @g()
More information about the cfe-commits
mailing list