1ac7c2c8a9d47df7d652364af3043c41816a18fa4Douglas Gregor// RUN: %clang_cc1 -fsyntax-only -verify %s
2ac7c2c8a9d47df7d652364af3043c41816a18fa4Douglas Gregor
3ac7c2c8a9d47df7d652364af3043c41816a18fa4Douglas Gregortemplate<typename T>
46cfacfe54c75baa4d67f1fbdf4f80644b662818eDouglas Gregorstruct X1 {
5cfe833be882f600206f1587f157b025b368497d7Douglas Gregor  friend void f6(int) { } // expected-error{{redefinition of}} \
6cfe833be882f600206f1587f157b025b368497d7Douglas Gregor                          // expected-note{{previous definition}}
76cfacfe54c75baa4d67f1fbdf4f80644b662818eDouglas Gregor};
86cfacfe54c75baa4d67f1fbdf4f80644b662818eDouglas Gregor
9238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas GregorX1<int> x1a;
10238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas GregorX1<float> x1b; // expected-note {{in instantiation of}}
11df48ddf97fb5a1310c99f3ece5255477dc1bbbdbDouglas Gregor
12df48ddf97fb5a1310c99f3ece5255477dc1bbbdbDouglas Gregortemplate<typename T>
13df48ddf97fb5a1310c99f3ece5255477dc1bbbdbDouglas Gregorstruct X2 {
14df48ddf97fb5a1310c99f3ece5255477dc1bbbdbDouglas Gregor  operator int();
15df48ddf97fb5a1310c99f3ece5255477dc1bbbdbDouglas Gregor
16df48ddf97fb5a1310c99f3ece5255477dc1bbbdbDouglas Gregor  friend void f(int x) { } // expected-error{{redefinition}} \
17df48ddf97fb5a1310c99f3ece5255477dc1bbbdbDouglas Gregor                           // expected-note{{previous definition}}
18df48ddf97fb5a1310c99f3ece5255477dc1bbbdbDouglas Gregor};
19df48ddf97fb5a1310c99f3ece5255477dc1bbbdbDouglas Gregor
20df48ddf97fb5a1310c99f3ece5255477dc1bbbdbDouglas Gregorint array0[sizeof(X2<int>)];
21df48ddf97fb5a1310c99f3ece5255477dc1bbbdbDouglas Gregorint array1[sizeof(X2<float>)]; // expected-note{{instantiation of}}
22df48ddf97fb5a1310c99f3ece5255477dc1bbbdbDouglas Gregor
23df48ddf97fb5a1310c99f3ece5255477dc1bbbdbDouglas Gregorvoid g() {
24df48ddf97fb5a1310c99f3ece5255477dc1bbbdbDouglas Gregor  X2<int> xi;
25df48ddf97fb5a1310c99f3ece5255477dc1bbbdbDouglas Gregor  f(xi);
26df48ddf97fb5a1310c99f3ece5255477dc1bbbdbDouglas Gregor  X2<float> xf;
27df48ddf97fb5a1310c99f3ece5255477dc1bbbdbDouglas Gregor  f(xf);
28df48ddf97fb5a1310c99f3ece5255477dc1bbbdbDouglas Gregor}
2922050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith
3022050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smithtemplate<typename T>
3122050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smithstruct X3 {
3222050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  operator int();
3322050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith
3422050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  friend void h(int x);
3522050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith};
3622050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith
3722050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smithint array2[sizeof(X3<int>)];
3822050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smithint array3[sizeof(X3<float>)];
3922050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith
4022050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smithvoid i() {
4122050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  X3<int> xi;
4222050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  h(xi);
4322050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  X3<float> xf;
4422050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  h(xf);
4522050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith}
46