http://llvm.org/bugs/show_bug.cgi?id=13142
Bug #: 13142
Summary: A call to a virtual function in the base chain of a
final class gets mapped to a direct call when calling
the function on an upcasted pointer
Product: clang
Version: unspecified
Platform: PC
OS/Version: All
Status: NEW
Severity: enhancement
Priority: P
Component: C++11
AssignedTo: [email protected]
ReportedBy: [email protected]
CC: [email protected], [email protected]
Classification: Unclassified
Consider the following program, compiled with clang++ test.cpp
-std=c++11 (on 3.1):
struct Base {
virtual void f() = 0;
};
struct Middle : Base {
virtual void x();
virtual void f();
};
void Middle::x() {}
struct Derived /*final*/ : Middle {
};
void foo(Derived* d) {
static_cast<Base*>(d)->f();
}
int main() {
foo(new Derived());
}
With the final keyword commented out, I get the following error when linking:
$ clang++ test.cpp -std=c++11
Undefined symbols for architecture x86_64:
"__ZN6Middle1fEv", referenced from:
__ZTV6Middle in test-FX2MFc.o
__ZTV7Derived in test-FX2MFc.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
With it not commented out, I get the following:
$ clang++ test.cpp -std=c++11
Undefined symbols for architecture x86_64:
"__ZN4Base1fEv", referenced from:
__Z3fooP7Derived in test-Akba5v.o
"__ZN6Middle1fEv", referenced from:
__ZTV6Middle in test-Akba5v.o
__ZTV7Derived in test-Akba5v.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
This affects Mozilla's nsBindingManager class
<http://mxr.mozilla.org/mozilla-central/source/content/xbl/src/nsBindingManager.h#33>
which I tried to mark as final bacause of this callsite:
<http://mxr.mozilla.org/mozilla-central/source/content/base/src/nsNodeUtils.cpp#50>
--
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.
_______________________________________________
LLVMbugs mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/llvmbugs