You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

76 lines
1.8 KiB

/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
namespace deduplication {
struct A {
int f;
};
template <typename T>
struct SomeTemplatedClass {
void templated_wrapper_delete_ok(A* a);
void templated_wrapper_access_ok(A* a);
void lifetime_error_bad(A* a);
};
template <typename T>
void SomeTemplatedClass<T>::templated_wrapper_delete_ok(A* a) {
delete a;
}
template <typename T>
void SomeTemplatedClass<T>::templated_wrapper_access_ok(A* a) {
int x = a->f;
}
template <typename T>
void SomeTemplatedClass<T>::lifetime_error_bad(A* a) {
SomeTemplatedClass<T>::templated_wrapper_delete_ok(a);
SomeTemplatedClass<T>::templated_wrapper_access_ok(a);
}
void materialize_class_template_instances() {
A* a1 = new A();
SomeTemplatedClass<int> x1;
x1.lifetime_error_bad(a1);
A* a2 = new A();
SomeTemplatedClass<int*> x2;
x2.lifetime_error_bad(a2);
}
template <typename T>
void templated_delete_function(T t, A* a) {
delete a;
}
template <typename T>
void templated_access_function(T t, A* a) {
int x = a->f;
}
template <typename T>
void templated_function_bad(T t) {
A* a = new A();
templated_delete_function<T>(t, a);
templated_access_function<T>(t, a);
}
template void templated_delete_function<int>(int, A*);
template void templated_delete_function<bool>(bool, A*);
template void templated_access_function<int>(int, A*);
template void templated_access_function<bool>(bool, A*);
template void templated_function_bad<int>(int);
template void templated_function_bad<bool>(bool);
void materialize_function_template_instances() {
templated_function_bad<int>(42);
templated_function_bad<bool>(true);
}
} // namespace deduplication