template <typename T> struct Foo;
typedef Foo<int> BarInt;
typedef Foo<double> BarDouble;
template <typename T> using Bar = Foo<T>;
template <typename T>
struct [[clang::preferred_name(BarInt), clang::preferred_name(BarDouble),
clang::preferred_name(Bar<short>), clang::preferred_name(Bar<short>),
clang::preferred_name(Bar<double>),
clang::preferred_name(Bar<char>)]] Foo{};
int main() {
BarInt barInt;
BarDouble barDouble;
Bar<short> barShort;
Bar<char> barChar;
Foo<int> varInt;
Foo<double> varDouble;
Foo<short> varShort;
Foo<char> varChar;
Foo<Foo<int>> varFooInt;
return 0;
}