From 7bb723065f787633f11f1e1b7eece86191d3815b Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Fri, 11 Oct 2013 20:46:27 +0000 Subject: [PATCH] Use castAs instead of cast in thunk generation Calling convention attributes can add sugar to methods that we have to look through. This fixes an assertion failure in the provided test case. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@192496 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGVTables.cpp | 2 +- test/CodeGenCXX/microsoft-abi-thunks.cpp | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/CodeGen/CGVTables.cpp b/lib/CodeGen/CGVTables.cpp index d530016f13..425c12301f 100644 --- a/lib/CodeGen/CGVTables.cpp +++ b/lib/CodeGen/CGVTables.cpp @@ -481,7 +481,7 @@ void CodeGenVTables::maybeEmitThunkForVTable(GlobalDecl GD, // We can't emit thunks for member functions with incomplete types. const CXXMethodDecl *MD = cast(GD.getDecl()); if (!CGM.getTypes().isFuncTypeConvertible( - cast(MD->getType().getTypePtr()))) + MD->getType()->castAs())) return; emitThunk(GD, Thunk, /*ForVTable=*/true); diff --git a/test/CodeGenCXX/microsoft-abi-thunks.cpp b/test/CodeGenCXX/microsoft-abi-thunks.cpp index 091ef3274b..3b4281f76d 100644 --- a/test/CodeGenCXX/microsoft-abi-thunks.cpp +++ b/test/CodeGenCXX/microsoft-abi-thunks.cpp @@ -116,3 +116,18 @@ struct H : E { H h; // FIXME: Write vtordisp adjusting thunk tests + +namespace CrashOnThunksForAttributedType { +// We used to crash on this because the type of foo is an AttributedType, not +// FunctionType, and we had to look through the sugar. +struct A { + virtual void __stdcall foo(); +}; +struct B { + virtual void __stdcall foo(); +}; +struct C : A, B { + virtual void __stdcall foo(); +}; +C c; +} -- 2.40.0