This is caused by 9d525bf.
dynamic_cast in the following code fails unless the optimization is disabled by passing -fno-assume-unique-vtables.
% cat a.h
struct Foo {
virtual ~Foo();
};
struct Bar final : public Foo {
};
Foo* makeBar();
% cat a.cc
#include "a.h"
Foo::~Foo() {}
Foo* makeBar() {
return new Bar();
}
% cat b.cc
#include "a.h"
int main() {
Foo* f = makeBar();
Bar* b = dynamic_cast<Bar*>(f); // b will incorrectly be nullptr
return !!b;
}
% clang++ -std=c++11 -c a.cc -O1
% clang++ -std=c++11 -c b.cc -O1
% clang++ -shared -o liba.so a.o
% clang++ --std=c++11 -o a.out b.o -Wl,-rpath,$PWD liba.so
% ./a.out
% echo $?
0