mirror of https://github.com/microsoft/clang.git
[MS] Fix unprototyped thunk emission for incomplete return types
Fixes PR37161 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@330303 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c4d3d32435
commit
4c8eda063b
|
@ -233,11 +233,15 @@ void CodeGenFunction::StartThunk(llvm::Function *Fn, GlobalDecl GD,
|
|||
const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
|
||||
QualType ThisType = MD->getThisType(getContext());
|
||||
const FunctionProtoType *FPT = MD->getType()->getAs<FunctionProtoType>();
|
||||
QualType ResultType = CGM.getCXXABI().HasThisReturn(GD)
|
||||
? ThisType
|
||||
: CGM.getCXXABI().hasMostDerivedReturn(GD)
|
||||
? CGM.getContext().VoidPtrTy
|
||||
: FPT->getReturnType();
|
||||
QualType ResultType;
|
||||
if (IsUnprototyped)
|
||||
ResultType = CGM.getContext().VoidTy;
|
||||
else if (CGM.getCXXABI().HasThisReturn(GD))
|
||||
ResultType = ThisType;
|
||||
else if (CGM.getCXXABI().hasMostDerivedReturn(GD))
|
||||
ResultType = CGM.getContext().VoidPtrTy;
|
||||
else
|
||||
ResultType = FPT->getReturnType();
|
||||
FunctionArgList FunctionArgs;
|
||||
|
||||
// Create the implicit 'this' parameter declaration.
|
||||
|
|
|
@ -24,11 +24,28 @@ struct B : virtual A {
|
|||
struct C : B { int c; };
|
||||
C c;
|
||||
|
||||
// Do the same thing, but with an incomplete return type.
|
||||
struct B1 { virtual DoNotInstantiate<void> f() = 0; };
|
||||
struct B2 { virtual DoNotInstantiate<void> f() = 0; };
|
||||
struct S : B1, B2 { DoNotInstantiate<void> f() override; };
|
||||
S s;
|
||||
|
||||
// CHECK: @"??_7S@@6BB2@@@" = linkonce_odr unnamed_addr constant
|
||||
// CHECK-SAME: void (%struct.S*, ...)* @"?f@S@@W7EAA?AU?$DoNotInstantiate@X@@XZ"
|
||||
|
||||
// CHECK: @"??_7C@@6B@" = linkonce_odr unnamed_addr constant
|
||||
// CHECK-SAME: void (%struct.B*, ...)* @"?foo@B@@W7EAAXUIncomplete@@@Z"
|
||||
// CHECK-SAME: void (%struct.B*, ...)* @"?bar@B@@W7EAAXU?$DoNotInstantiate@H@@@Z"
|
||||
// CHECK-SAME: i32 (i8*, i32)* @"?baz@B@@W7EAAHU?$InstantiateLater@H@@@Z"
|
||||
|
||||
|
||||
// CHECK-LABEL: define linkonce_odr dso_local void @"?f@S@@W7EAA?AU?$DoNotInstantiate@X@@XZ"(%struct.S* %this, ...)
|
||||
// CHECK: %[[THIS_ADJ_i8:[^ ]*]] = getelementptr i8, i8* {{.*}}, i32 -8
|
||||
// CHECK: %[[THIS_ADJ:[^ ]*]] = bitcast i8* %[[THIS_ADJ_i8]] to %struct.S*
|
||||
// CHECK: musttail call void (%struct.S*, ...) {{.*}}@"?f@S@@UEAA?AU?$DoNotInstantiate@X@@XZ"
|
||||
// CHECK-SAME: (%struct.S* %[[THIS_ADJ]], ...)
|
||||
// CHECK: ret void
|
||||
|
||||
// The thunks should have a -8 adjustment.
|
||||
|
||||
// CHECK-LABEL: define linkonce_odr dso_local void @"?foo@B@@W7EAAXUIncomplete@@@Z"(%struct.B* %this, ...)
|
||||
|
|
Loading…
Reference in New Issue