xref: /llvm-project/clang/test/SemaTemplate/array-redeclaration.cpp (revision 1b8125b041e28a315e5c5fe64441a2fb07a2f5ea)
13e34cfe8SAkira Hatanaka // RUN: %clang_cc1 -fsyntax-only -verify %s
23e34cfe8SAkira Hatanaka // expected-no-diagnostics
33e34cfe8SAkira Hatanaka 
43e34cfe8SAkira Hatanaka extern int array[1];
53e34cfe8SAkira Hatanaka 
63e34cfe8SAkira Hatanaka template <typename>
73e34cfe8SAkira Hatanaka class C {
83e34cfe8SAkira Hatanaka   enum { D };
93e34cfe8SAkira Hatanaka public:
foo1()103e34cfe8SAkira Hatanaka   template <typename A> void foo1() {
113e34cfe8SAkira Hatanaka     extern int array[((int)C<A>::k > (int)D) ? 1 : -1];
123e34cfe8SAkira Hatanaka   }
133e34cfe8SAkira Hatanaka };
143e34cfe8SAkira Hatanaka 
153e34cfe8SAkira Hatanaka template<>
163e34cfe8SAkira Hatanaka class C<int> {
173e34cfe8SAkira Hatanaka public:
183e34cfe8SAkira Hatanaka   const static int k = 2;
193e34cfe8SAkira Hatanaka };
203e34cfe8SAkira Hatanaka 
foo2()213e34cfe8SAkira Hatanaka void foo2() {
223e34cfe8SAkira Hatanaka   C<char> c;
233e34cfe8SAkira Hatanaka   c.foo1<int>();
243e34cfe8SAkira Hatanaka }
253e34cfe8SAkira Hatanaka 
263e34cfe8SAkira Hatanaka template<int n>
foo3()273e34cfe8SAkira Hatanaka void foo3() {
283e34cfe8SAkira Hatanaka   extern int array[n ? 1 : -1];
293e34cfe8SAkira Hatanaka }
303e34cfe8SAkira Hatanaka 
foo4()313e34cfe8SAkira Hatanaka void foo4() {
323e34cfe8SAkira Hatanaka   foo3<5>();
333e34cfe8SAkira Hatanaka }
34*1b8125b0SRichard Smith 
35*1b8125b0SRichard Smith namespace NS {
f()36*1b8125b0SRichard Smith   int f() { extern int arr[3]; { extern int arr[]; } return 0; }
g()37*1b8125b0SRichard Smith   template<typename T> void g() { extern int arr[3]; extern T arr; }
38*1b8125b0SRichard Smith   template void g<int[]>();
39*1b8125b0SRichard Smith }
40