// RUN: %clang_cc1 -triple=x86_64-unknown-linux-gnu -emit-llvm -o - %s | FileCheck %s
template <typename T>
struct Foo {
private:
T x;
public:
Foo(T x) : x(x) {}
~Foo() {}
T get() { return x; }
void set(T _x) { x = _x; }
};
template <typename T>
struct Bar {
private:
struct Foo<T> foo;
public:
Bar(T x) : foo(x) {}
~Bar() {}
T get() { return foo.get(); }
void set(T _x) { foo.set(_x); }
};
template <typename T>
struct Baz : Foo<T> {
public:
Baz(T x) : Foo<T>(x) {}
~Baz() {}
};
// These two specializations should generate lines for all of Foo's methods.
template struct Foo<char>;
template struct Foo<short>;
// This should not generate lines for the implicit specialization of Foo, but
// should generate lines for the explicit specialization of Bar.
template struct Bar<int>;
// This should not generate lines for the implicit specialization of Foo, but
// should generate lines for the explicit specialization of Baz.
template struct Baz<long>;