This change breaks a test: http://lab.llvm.org:8080/green/job/clang-stage2-configure-Rlto_check/4473/testReport/Clang/CodeGenCXX/microsoft_abi_virtual_member_pointers_cpp/
On Thu, Jun 11, 2015 at 2:29 AM David Majnemer <[email protected]> wrote: > Author: majnemer > Date: Wed Jun 10 19:20:57 2015 > New Revision: 239499 > > URL: http://llvm.org/viewvc/llvm-project?rev=239499&view=rev > Log: > [MS ABI] Allow memfn pointers with unconvertible types to be formed > > Remove the restriction which forbade forming pointers to member > functions which had parameter types or return types which were not > convertible. > > Modified: > cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp > cfe/trunk/test/CodeGenCXX/microsoft-abi-virtual-member-pointers.cpp > > Modified: cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp?rev=239499&r1=239498&r2=239499&view=diff > > ============================================================================== > --- cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp (original) > +++ cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp Wed Jun 10 19:20:57 2015 > @@ -2423,12 +2423,7 @@ MicrosoftCXXABI::BuildMemberPointer(cons > FirstField = CGM.GetAddrOfFunction(MD, Ty); > FirstField = llvm::ConstantExpr::getBitCast(FirstField, > CGM.VoidPtrTy); > } else { > - if (!CGM.getTypes().isFuncTypeConvertible( > - MD->getType()->castAs<FunctionType>())) { > - CGM.ErrorUnsupported(MD, "pointer to virtual member function with " > - "incomplete return or parameter type"); > - FirstField = llvm::Constant::getNullValue(CGM.VoidPtrTy); > - } else if (FPT->getCallConv() == CC_X86FastCall) { > + if (FPT->getCallConv() == CC_X86FastCall) { > CGM.ErrorUnsupported(MD, "pointer to fastcall virtual member > function"); > FirstField = llvm::Constant::getNullValue(CGM.VoidPtrTy); > } else { > > Modified: > cfe/trunk/test/CodeGenCXX/microsoft-abi-virtual-member-pointers.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/microsoft-abi-virtual-member-pointers.cpp?rev=239499&r1=239498&r2=239499&view=diff > > ============================================================================== > --- cfe/trunk/test/CodeGenCXX/microsoft-abi-virtual-member-pointers.cpp > (original) > +++ cfe/trunk/test/CodeGenCXX/microsoft-abi-virtual-member-pointers.cpp > Wed Jun 10 19:20:57 2015 > @@ -1,5 +1,5 @@ > -// RUN: %clang_cc1 -fno-rtti -emit-llvm -triple=i386-pc-win32 %s -o - | > FileCheck %s --check-prefix=CHECK32 > -// RUN: %clang_cc1 -fno-rtti -emit-llvm -triple=x86_64-pc-win32 %s -o - | > FileCheck %s --check-prefix=CHECK64 > +// RUN: %clang_cc1 -std=c++11 -fno-rtti -emit-llvm -triple=i386-pc-win32 > %s -o - | FileCheck %s --check-prefix=CHECK32 > +// RUN: %clang_cc1 -std=c++11 -fno-rtti -emit-llvm > -triple=x86_64-pc-win32 %s -o - | FileCheck %s --check-prefix=CHECK64 > > struct S { > int x, y, z; > @@ -13,12 +13,15 @@ struct U { > U(const U &); > }; > > +struct B; > + > struct C { > virtual void foo(); > virtual int bar(int, double); > virtual S baz(int); > virtual S qux(U); > virtual void thud(...); > + virtual void (B::*plugh())(); > }; > > namespace { > @@ -47,6 +50,8 @@ void f() { > void (C::*ptr6)(...); > ptr6 = &C::thud; > > + auto ptr7 = &C::plugh; > + > > // CHECK32-LABEL: define void @"\01?f@@YAXXZ"() > // CHECK32: store i8* bitcast (void (%struct.C*, ...)* @"\01??_9C@@$BA@AE" > to i8*), i8** %ptr > @@ -165,6 +170,20 @@ void f() { > // CHECK64: [[CALLEE:%.*]] = load void (%struct.C*, ...)*, void > (%struct.C*, ...)** [[VPTR]] > // CHECK64: musttail call void (%struct.C*, ...) [[CALLEE]](%struct.C* > %{{.*}}, ...) > // CHECK64: ret void > +// CHECK64: } > + > +// CHECK32: define linkonce_odr x86_thiscallcc void > @"\01??_9C@@$BBE@AE"(%struct.C* > %this, ...) {{.*}} comdat align 2 { > +// CHECK32: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, > ...)*, void (%struct.C*, ...)** %vtable, i64 5 > +// CHECK32: [[CALLEE:%.*]] = load void (%struct.C*, ...)*, void > (%struct.C*, ...)** [[VPTR]] > +// CHECK32: musttail call x86_thiscallcc void (%struct.C*, ...) > [[CALLEE]](%struct.C* %{{.*}}, ...) > +// CHECK32: ret void > +// CHECK32: } > + > +// CHECK64: define linkonce_odr void @"\01??_9C@@$BCI@AA"(%struct.C* > %this, ...) {{.*}} comdat align 2 { > +// CHECK64: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, > ...)*, void (%struct.C*, ...)** %vtable, i64 5 > +// CHECK64: [[CALLEE:%.*]] = load void (%struct.C*, ...)*, void > (%struct.C*, ...)** [[VPTR]] > +// CHECK64: musttail call void (%struct.C*, ...) [[CALLEE]](%struct.C* > %{{.*}}, ...) > +// CHECK64: ret void > // CHECK64: } > > // CHECK32: #[[ATTR]] = {{{.*}}"thunk"{{.*}}} > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
