Home | History | Annotate | Download | only in SemaTemplate
      1 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++1z %s
      2 
      3 template<typename T, T val> struct A {};
      4 
      5 template<typename T, typename U> constexpr bool is_same = false; // expected-note +{{here}}
      6 template<typename T> constexpr bool is_same<T, T> = true;
      7 
      8 namespace String {
      9   A<const char*, "test"> a; // expected-error {{does not refer to any declaration}}
     10   A<const char (&)[5], "test"> b; // expected-error {{does not refer to any declaration}}
     11 }
     12 
     13 namespace Array {
     14   char arr[3];
     15   char x;
     16   A<const char*, arr> a;
     17   A<const char(&)[3], arr> b;
     18   A<const char*, &arr[0]> c;
     19   A<const char*, &arr[1]> d; // expected-error {{refers to subobject '&arr[1]'}}
     20   A<const char*, (&arr)[0]> e;
     21   A<const char*, &x> f;
     22   A<const char*, &(&x)[0]> g;
     23   A<const char*, &(&x)[1]> h; // expected-error {{refers to subobject '&x + 1'}}
     24   A<const char*, 0> i; // expected-error {{not allowed in a converted constant}}
     25   A<const char*, nullptr> j;
     26 }
     27 
     28 namespace Function {
     29   void f();
     30   void g() noexcept;
     31   void h();
     32   void h(int);
     33   template<typename...T> void i(T...);
     34   typedef A<void (*)(), f> a;
     35   typedef A<void (*)(), &f> a;
     36   typedef A<void (*)(), g> b;
     37   typedef A<void (*)(), &g> b;
     38   typedef A<void (*)(), h> c;
     39   typedef A<void (*)(), &h> c;
     40   typedef A<void (*)(), i> d;
     41   typedef A<void (*)(), &i> d;
     42   typedef A<void (*)(), i<>> d;
     43   typedef A<void (*)(), i<int>> e; // expected-error {{is not implicitly convertible}}
     44 
     45   typedef A<void (*)(), 0> x; // expected-error {{not allowed in a converted constant}}
     46   typedef A<void (*)(), nullptr> y;
     47 }
     48 
     49 void Func() {
     50   A<const char*, __func__> a; // expected-error {{does not refer to any declaration}}
     51 }
     52 
     53 namespace LabelAddrDiff {
     54   void f() {
     55     a: b: A<int, __builtin_constant_p(true) ? (__INTPTR_TYPE__)&&b - (__INTPTR_TYPE__)&&a : 0> s; // expected-error {{label address difference}}
     56   };
     57 }
     58 
     59 namespace Temp {
     60   struct S { int n; };
     61   constexpr S &addr(S &&s) { return s; }
     62   A<S &, addr({})> a; // expected-error {{constant}} expected-note 2{{temporary}}
     63   A<S *, &addr({})> b; // expected-error {{constant}} expected-note 2{{temporary}}
     64   A<int &, addr({}).n> c; // expected-error {{constant}} expected-note 2{{temporary}}
     65   A<int *, &addr({}).n> d; // expected-error {{constant}} expected-note 2{{temporary}}
     66 }
     67 
     68 namespace std { struct type_info; }
     69 
     70 namespace RTTI {
     71   A<const std::type_info&, typeid(int)> a; // expected-error {{does not refer to any declaration}}
     72   A<const std::type_info*, &typeid(int)> b; // expected-error {{does not refer to any declaration}}
     73 }
     74 
     75 namespace PtrMem {
     76   struct B { int b; };
     77   struct C : B {};
     78   struct D : B {};
     79   struct E : C, D { int e; };
     80 
     81   constexpr int B::*b = &B::b;
     82   constexpr int C::*cb = b;
     83   constexpr int D::*db = b;
     84   constexpr int E::*ecb = cb; // expected-note +{{here}}
     85   constexpr int E::*edb = db; // expected-note +{{here}}
     86 
     87   constexpr int E::*e = &E::e;
     88   constexpr int D::*de = (int D::*)e;
     89   constexpr int C::*ce = (int C::*)e;
     90   constexpr int B::*bde = (int B::*)de; // expected-note +{{here}}
     91   constexpr int B::*bce = (int B::*)ce; // expected-note +{{here}}
     92 
     93   // FIXME: This should all be accepted, but we don't yet have a representation
     94   // nor mangling for this form of template argument.
     95   using Ab = A<int B::*, b>;
     96   using Ab = A<int B::*, &B::b>;
     97   using Abce = A<int B::*, bce>; // expected-error {{not supported}}
     98   using Abde = A<int B::*, bde>; // expected-error {{not supported}}
     99   static_assert(!is_same<Ab, Abce>, ""); // expected-error {{undeclared}} expected-error {{must be a type}}
    100   static_assert(!is_same<Ab, Abde>, ""); // expected-error {{undeclared}} expected-error {{must be a type}}
    101   static_assert(!is_same<Abce, Abde>, ""); // expected-error 2{{undeclared}} expected-error {{must be a type}}
    102   static_assert(is_same<Abce, A<int B::*, (int B::*)(int C::*)&E::e>, ""); // expected-error {{undeclared}} expected-error {{not supported}}
    103 
    104   using Ae = A<int E::*, e>;
    105   using Ae = A<int E::*, &E::e>;
    106   using Aecb = A<int E::*, ecb>; // expected-error {{not supported}}
    107   using Aedb = A<int E::*, edb>; // expected-error {{not supported}}
    108   static_assert(!is_same<Ae, Aecb>, ""); // expected-error {{undeclared}} expected-error {{must be a type}}
    109   static_assert(!is_same<Ae, Aedb>, ""); // expected-error {{undeclared}} expected-error {{must be a type}}
    110   static_assert(!is_same<Aecb, Aedb>, ""); // expected-error 2{{undeclared}} expected-error {{must be a type}}
    111   static_assert(is_same<Aecb, A<int E::*, (int E::*)(int C::*)&B::b>, ""); // expected-error {{undeclared}} expected-error {{not supported}}
    112 
    113   using An = A<int E::*, nullptr>;
    114   using A0 = A<int E::*, (int E::*)0>;
    115   static_assert(is_same<An, A0>);
    116 }
    117 
    118 namespace DeduceDifferentType {
    119   template<int N> struct A {};
    120   template<long N> int a(A<N>); // expected-note {{does not have the same type}}
    121   int a_imp = a(A<3>()); // expected-error {{no matching function}}
    122   int a_exp = a<3>(A<3>());
    123 
    124   template<decltype(nullptr)> struct B {};
    125   template<int *P> int b(B<P>); // expected-note {{could not match}} expected-note {{not implicitly convertible}}
    126   int b_imp = b(B<nullptr>()); // expected-error {{no matching function}}
    127   int b_exp = b<nullptr>(B<nullptr>()); // expected-error {{no matching function}}
    128 
    129   struct X { constexpr operator int() { return 0; } } x;
    130   template<X &> struct C {};
    131   template<int N> int c(C<N>); // expected-note {{does not have the same type}} expected-note {{not implicitly convertible}}
    132   int c_imp = c(C<x>()); // expected-error {{no matching function}}
    133   int c_exp = c<x>(C<x>()); // expected-error {{no matching function}}
    134 
    135   struct Z;
    136   struct Y { constexpr operator Z&(); } y;
    137   struct Z { constexpr operator Y&() { return y; } } z;
    138   constexpr Y::operator Z&() { return z; }
    139   template<Y &> struct D {};
    140   template<Z &z> int d(D<z>); // expected-note {{does not have the same type}}
    141   int d_imp = d(D<y>()); // expected-error {{no matching function}}
    142   int d_exp = d<y>(D<y>());
    143 }
    144 
    145 namespace DeclMatch {
    146   template<typename T, T> int f();
    147   template<typename T> class X { friend int f<T, 0>(); static int n; };
    148   template<typename T, T> int f() { return X<T>::n; }
    149   int k = f<int, 0>(); // ok, friend
    150 }
    151 
    152 namespace PR24921 {
    153   enum E { e };
    154   template<E> void f();
    155   template<int> void f(int);
    156   template<> void f<e>() {}
    157 }
    158