[LLVMbugs] [Bug 14339] New: Virtual methods allowed to have mismatching calling convention
bugzilla-daemon at llvm.org
bugzilla-daemon at llvm.org
Wed Nov 14 12:16:11 PST 2012
http://llvm.org/bugs/show_bug.cgi?id=14339
Bug #: 14339
Summary: Virtual methods allowed to have mismatching calling
convention
Product: clang
Version: trunk
Platform: PC
OS/Version: All
Status: NEW
Severity: normal
Priority: P
Component: C++
AssignedTo: unassignedclangbugs at nondot.org
ReportedBy: daniel.c.klauer at web.de
CC: dgregor at apple.com, llvmbugs at cs.uiuc.edu
Classification: Unclassified
Created attachment 9537
--> http://llvm.org/bugs/attachment.cgi?id=9537
virtual override with mismatching calling conventions
clang++ does not show an error (nor a warning) when an overriding method uses a
different calling convention than the overridden virtual, for example:
class A {
public:
__attribute__((stdcall)) virtual void f();
};
class B : public A {
public:
__attribute__((cdecl)) void f();
};
This code should trigger an error though, because the functions are
incompatible, similar to the following example:
void (__attribute__((stdcall)) *p1)();
void (__attribute__((cdecl)) *p2)();
p1 = p2;
which triggers an "assigning to '...' from incompatible type '...'" error.
Looking at the LLVM IR output of -S -emit-llvm shows that the stdcall method is
emitted with x86_stdcallcc, and the call following the vtable lookup also uses
x86_stdcallcc, even though the loaded address points to a cdecl function.
A full example is attached. Compiling it with GCC's g++ shows a "conflicting
type attributes specified ..." error as expected; see also gcc bug 14688 [1].
Tested with:
$ clang++ --version
Ubuntu clang version 3.0-6ubuntu3 (tags/RELEASE_30/final) (based on LLVM
3.0)
Target: i386-pc-linux-gnu
Thread model: posix
$ build/Debug+Asserts/bin/clang++ --version
clang version 3.2 (trunk 167930)
Target: i386-pc-linux-gnu
Thread model: posix
but presumably all x86 targets are affected.
[1] http://gcc.gnu.org/bugzilla/show_bug.cgi?id=14688
--
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
More information about the llvm-bugs
mailing list