forked from OSchip/llvm-project
Discussing with dgregor we decided that we should not force the emission of
implicit methods on explicit template instantiation definitions. As a consequence, we should emit them at every use, even if we see a explicit template instantiation declaration. This is already the current behaviour, but it is good to test for that :-) llvm-svn: 99443
This commit is contained in:
parent
8edc6dfd20
commit
1dbd474f2e
|
@ -3,6 +3,10 @@
|
|||
// CHECK-NOT: @_ZTVN5test118stdio_sync_filebufIwEE = constant
|
||||
// CHECK: @_ZTVN5test018stdio_sync_filebufIwEE = constant
|
||||
|
||||
// CHECK: define linkonce_odr void @_ZN5test21CIiEC1Ev(
|
||||
// CHECK: define linkonce_odr void @_ZN5test21CIiE6foobarIdEEvT_(
|
||||
// CHECK: define available_externally void @_ZN5test21CIiE6zedbarEd(
|
||||
|
||||
namespace test0 {
|
||||
struct basic_streambuf {
|
||||
virtual ~basic_streambuf();
|
||||
|
@ -31,3 +35,28 @@ namespace test1 {
|
|||
// Just a declaration should not force the vtable to be emitted.
|
||||
template<> void stdio_sync_filebuf<wchar_t>::xsgetn();
|
||||
}
|
||||
|
||||
namespace test2 {
|
||||
template<typename T1>
|
||||
class C {
|
||||
virtual ~C();
|
||||
void zedbar(double) {
|
||||
}
|
||||
template<typename T2>
|
||||
void foobar(T2 foo) {
|
||||
}
|
||||
};
|
||||
extern template class C<int>;
|
||||
void g() {
|
||||
// The extern template declaration should not prevent us from producing
|
||||
// the implicit constructor (test at the top).
|
||||
C<int> a;
|
||||
|
||||
// or foobar(test at the top).
|
||||
a.foobar(0.0);
|
||||
|
||||
// But it should prevent zebbar
|
||||
// (test at the top).
|
||||
a.zedbar(0.0);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue