| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- // RUN: %clang_cc1 -fsyntax-only -verify %s
- namespace N {
- struct Outer {
- struct Inner {
- template<typename T>
- struct InnerTemplate {
- struct VeryInner {
- typedef T type;
- static enum K1 { K1Val = sizeof(T) } Kind1;
- static enum { K2Val = sizeof(T)*2 } Kind2;
- enum { K3Val = sizeof(T)*2 } Kind3;
- void foo() {
- K1 k1 = K1Val;
- Kind1 = K1Val;
- Outer::Inner::InnerTemplate<type>::VeryInner::Kind2 = K2Val;
- Kind3 = K3Val;
- }
- struct UeberInner {
- void bar() {
- K1 k1 = K1Val;
- Kind1 = K1Val;
- Outer::Inner::InnerTemplate<type>::VeryInner::Kind2 = K2Val;
- InnerTemplate t;
- InnerTemplate<type> t2;
- }
- };
- };
- };
- };
- };
- }
- typedef int INT;
- template struct N::Outer::Inner::InnerTemplate<INT>::VeryInner;
- template struct N::Outer::Inner::InnerTemplate<INT>::UeberInner; // expected-error{{no struct named 'UeberInner' in 'N::Outer::Inner::InnerTemplate<int>'}}
- namespace N2 {
- struct Outer2 {
- template<typename T, typename U = T>
- struct Inner {
- void foo() {
- enum { K1Val = sizeof(T) } k1;
- enum K2 { K2Val = sizeof(T)*2 } k2a;
- K2 k2b = K2Val;
- struct S { T x, y; } s1;
- struct { U x, y; } s2;
- s1.x = s2.x; // expected-error{{incompatible}}
- typedef T type;
- type t2 = s1.x;
- typedef struct { T z; } type2;
- type2 t3 = { s1.x };
- Inner i1;
- i1.foo();
- Inner<T> i2;
- i2.foo();
- }
- };
- };
- }
- template struct N2::Outer2::Inner<float>;
- template struct N2::Outer2::Inner<int*, float*>; // expected-note{{instantiation}}
- // Test dependent pointer-to-member expressions.
- template<typename T>
- struct smart_ptr {
- struct safe_bool {
- int member;
- };
-
- operator int safe_bool::*() const {
- return ptr? &safe_bool::member : 0;
- }
-
- T* ptr;
- };
- void test_smart_ptr(smart_ptr<int> p) {
- if (p) { }
- }
- // PR5517
- namespace test0 {
- template <int K> struct X {
- X() { extern void x(); }
- };
- void g() { X<2>(); }
- }
- // <rdar://problem/8302161>
- namespace test1 {
- template <typename T> void f(T const &t) {
- union { char c; T t_; };
- c = 'a'; // <- this shouldn't silently fail to instantiate
- T::foo(); // expected-error {{has no members}}
- }
- template void f(int const &); // expected-note {{requested here}}
- }
- namespace test2 {
- template<typename T> void f() {
- T::error; // expected-error {{no member}}
- }
- void g() {
- // This counts as an odr-use, so should trigger the instantiation of f<int>.
- (void)&f<int>; // expected-note {{here}}
- }
- }
|