1 template <typename T> struct Foo; 2 3 typedef Foo<int> BarInt; 4 typedef Foo<double> BarDouble; 5 6 template <typename T> using Bar = Foo<T>; 7 8 template <typename T> 9 struct [[clang::preferred_name(BarInt), clang::preferred_name(BarDouble), 10 clang::preferred_name(Bar<short>), clang::preferred_name(Bar<short>), 11 clang::preferred_name(Bar<double>), 12 clang::preferred_name(Bar<char>)]] Foo{}; 13 main()14int main() { 15 BarInt barInt; 16 BarDouble barDouble; 17 Bar<short> barShort; 18 Bar<char> barChar; 19 20 Foo<int> varInt; 21 Foo<double> varDouble; 22 Foo<short> varShort; 23 Foo<char> varChar; 24 Foo<Foo<int>> varFooInt; 25 return 0; 26 } 27