Home | History | Annotate | Download | only in SemaTemplate
      1 // RUN: %clang_cc1 -fsyntax-only -verify %s
      2 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
      3 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
      4 
      5 // PR4607
      6 template <class T> struct X {};
      7 
      8 template <> struct X<char>
      9 {
     10   static char* g();
     11 };
     12 
     13 template <class T> struct X2 {};
     14 
     15 template <class U>
     16 struct X2<U*> {
     17   static void f() {
     18     X<U>::g();
     19   }
     20 };
     21 
     22 void a(char *a, char *b) {X2<char*>::f();}
     23 
     24 namespace WonkyAccess {
     25   template<typename T>
     26   struct X {
     27     int m;
     28   };
     29 
     30   template<typename U>
     31   class Y;
     32 
     33   template<typename U>
     34   struct Y<U*> : X<U> { };
     35 
     36   template<>
     37   struct Y<float*> : X<float> { };
     38 
     39   int f(Y<int*> y, Y<float*> y2) {
     40     return y.m + y2.m;
     41   }
     42 }
     43 
     44 // <rdar://problem/9169404>
     45 namespace rdar9169404 {
     46   template<typename T, T N> struct X { };
     47   template<bool C> struct X<bool, C> {
     48     typedef int type;
     49   };
     50 
     51   X<bool, -1>::type value;
     52 #if __cplusplus >= 201103L
     53   // expected-error@-2 {{non-type template argument evaluates to -1, which cannot be narrowed to type 'bool'}}
     54 #else
     55   // expected-no-diagnostics
     56 #endif
     57 }
     58