diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2011-12-26 22:42:47 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2011-12-26 22:42:47 +0000 |
| commit | cde2c8f7d27f376279f36bd38097551ec717bed2 (patch) | |
| tree | 0187d63ca8b9c6df1ab9fa442a3ce28f654980d6 /clang/test | |
| parent | 8d302df4a43e95c89de272adff79c71c61249990 (diff) | |
| download | bcm5719-llvm-cde2c8f7d27f376279f36bd38097551ec717bed2.tar.gz bcm5719-llvm-cde2c8f7d27f376279f36bd38097551ec717bed2.zip | |
Delay checking of typedefs of dependent types. Fixes PR11630.
llvm-svn: 147281
Diffstat (limited to 'clang/test')
| -rw-r--r-- | clang/test/SemaCXX/typedef-redecl.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/clang/test/SemaCXX/typedef-redecl.cpp b/clang/test/SemaCXX/typedef-redecl.cpp index 31de9c00c10..b53bcd2b458 100644 --- a/clang/test/SemaCXX/typedef-redecl.cpp +++ b/clang/test/SemaCXX/typedef-redecl.cpp @@ -59,3 +59,37 @@ template<typename T> typedef T f(T t) { return t; } // expected-error {{function definition declared 'typedef'}} int k = f(0); int k2 = k; + +namespace PR11630 { + template <class T> + struct S + { + static const unsigned C = 1; + static void f() + { + typedef int q[C == 1 ? 1 : -1]; // expected-note{{previous definition is here}} + typedef int q[C >= 1 ? 2 : -2]; // expected-error{{typedef redefinition with different types ('int [2]' vs 'int [1]')}} + typedef int n[C == 1 ? 1 : -1]; + typedef int n[C >= 1 ? 1 : -1]; + } + }; + + template <int T> + struct S2 + { + static void f() + { + typedef int q[1]; // expected-note{{previous definition is here}} + typedef int q[T]; // expected-error{{typedef redefinition with different types ('int [2]' vs 'int [1]')}} + } + }; + + void f() { + S<int> a; + a.f(); // expected-note{{in instantiation of member function 'PR11630::S<int>::f' requested here}} + S2<1> b; + b.f(); + S2<2> b2; + b2.f(); // expected-note{{in instantiation of member function 'PR11630::S2<2>::f' requested here}} + } +} |

