r282457 - P0145R3 (C++17 evaluation order tweaks): evaluate the base expression before

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Mon Sep 26 16:56:58 PDT 2016


Author: rsmith
Date: Mon Sep 26 18:56:57 2016
New Revision: 282457

URL: http://llvm.org/viewvc/llvm-project?rev=282457&view=rev
Log:
P0145R3 (C++17 evaluation order tweaks): evaluate the base expression before
the pointer-to-member expression in calls through .* and ->* expressions.

Modified:
    cfe/trunk/lib/CodeGen/CGExprCXX.cpp
    cfe/trunk/test/CodeGenCXX/cxx1z-eval-order.cpp

Modified: cfe/trunk/lib/CodeGen/CGExprCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprCXX.cpp?rev=282457&r1=282456&r2=282457&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGExprCXX.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExprCXX.cpp Mon Sep 26 18:56:57 2016
@@ -301,9 +301,6 @@ CodeGenFunction::EmitCXXMemberPointerCal
   const CXXRecordDecl *RD = 
     cast<CXXRecordDecl>(MPT->getClass()->getAs<RecordType>()->getDecl());
 
-  // Get the member function pointer.
-  llvm::Value *MemFnPtr = EmitScalarExpr(MemFnExpr);
-
   // Emit the 'this' pointer.
   Address This = Address::invalid();
   if (BO->getOpcode() == BO_PtrMemI)
@@ -314,6 +311,9 @@ CodeGenFunction::EmitCXXMemberPointerCal
   EmitTypeCheck(TCK_MemberCall, E->getExprLoc(), This.getPointer(),
                 QualType(MPT->getClass(), 0));
 
+  // Get the member function pointer.
+  llvm::Value *MemFnPtr = EmitScalarExpr(MemFnExpr);
+
   // Ask the ABI to load the callee.  Note that This is modified.
   llvm::Value *ThisPtrForCall = nullptr;
   llvm::Value *Callee =

Modified: cfe/trunk/test/CodeGenCXX/cxx1z-eval-order.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/cxx1z-eval-order.cpp?rev=282457&r1=282456&r2=282457&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/cxx1z-eval-order.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/cxx1z-eval-order.cpp Mon Sep 26 18:56:57 2016
@@ -125,35 +125,35 @@ void alloc_before_init() {
 // CHECK: }
 }
 
-#if 0
-// CHECKDISABLED-LABEL: define {{.*}}@{{.*}}dotstar_lhs_before_rhs{{.*}}(
+
+// CHECK-LABEL: define {{.*}}@{{.*}}dotstar_lhs_before_rhs{{.*}}(
 int dotstar_lhs_before_rhs() {
-  // CHECKDISABLED: call {{.*}}@{{.*}}make_a{{.*}}(
-  // CHECKDISABLED: call {{.*}}@{{.*}}make_mem_ptr_a{{.*}}(
+  // CHECK: call {{.*}}@{{.*}}make_a{{.*}}(
+  // CHECK: call {{.*}}@{{.*}}make_mem_ptr_a{{.*}}(
   int a = make_a().*make_mem_ptr_a();
 
-  // CHECKDISABLED: call {{.*}}@{{.*}}make_a_ptr{{.*}}(
-  // CHECKDISABLED: call {{.*}}@{{.*}}make_mem_ptr_a{{.*}}(
+  // CHECK: call {{.*}}@{{.*}}make_a_ptr{{.*}}(
+  // CHECK: call {{.*}}@{{.*}}make_mem_ptr_a{{.*}}(
   int b = make_a_ptr()->*make_mem_ptr_a();
 
-  // CHECKDISABLED: call {{.*}}@{{.*}}make_c{{.*}}(
-  // CHECKDISABLED: call {{.*}}@{{.*}}make_b{{.*}}(
+  // CHECK: call {{.*}}@{{.*}}make_c{{.*}}(
+  // CHECK: call {{.*}}@{{.*}}make_b{{.*}}(
   make_c()->*make_b();
 
-  // CHECKDISABLED: call {{.*}}@{{.*}}make_a{{.*}}(
-  // CHECKDISABLED: call {{.*}}@{{.*}}make_mem_fn_ptr_a{{.*}}(
-  // CHECKDISABLED: call
+  // CHECK: call {{.*}}@{{.*}}make_a{{.*}}(
+  // CHECK: call {{.*}}@{{.*}}make_mem_fn_ptr_a{{.*}}(
+  // CHECK: call
   (make_a().*make_mem_fn_ptr_a())();
 
-  // CHECKDISABLED: call {{.*}}@{{.*}}make_a_ptr{{.*}}(
-  // CHECKDISABLED: call {{.*}}@{{.*}}make_mem_fn_ptr_a{{.*}}(
-  // CHECKDISABLED: call
+  // CHECK: call {{.*}}@{{.*}}make_a_ptr{{.*}}(
+  // CHECK: call {{.*}}@{{.*}}make_mem_fn_ptr_a{{.*}}(
+  // CHECK: call
   (make_a_ptr()->*make_mem_fn_ptr_a())();
 
   return a + b;
-// CHECKDISABLED: }
+// CHECK: }
 }
-#endif
+
 #if 0
 // CHECKDISABLED-LABEL: define {{.*}}@{{.*}}assign_lhs_before_rhs{{.*}}(
 void assign_rhs_before_lhs() {




More information about the cfe-commits mailing list