// RUN: %clang_cc1 -fsyntax-only -verify -triple=x86_64-linux-gnu %s

// C++11 [temp.arg.nontype]p1:
//
//   A template-argument for a non-type, non-template template-parameter shall
//   be one of:
//   -- an integral constant expression; or
//   -- the name of a non-type template-parameter ; or
namespace non_type_tmpl_param {
  template <int N> struct X0 { X0(); };
  template <int N> X0<N>::X0() { }
  template <int* N> struct X1 { X1(); };
  template <int* N> X1<N>::X1() { }
  template <int& N> struct X3 { X3(); };
  template <int& N> X3<N>::X3() { }
  template <int (*F)(int)> struct X4 { X4(); };
  template <int (*F)(int)> X4<F>::X4() { }
  template <typename T, int (T::* M)(int)> struct X5 { X5(); };
  template <typename T, int (T::* M)(int)> X5<T, M>::X5() { }
}

//   -- a constant expression that designates the address of an object with
//      static storage duration and external or internal linkage or a function
//      with external or internal linkage, including function templates and
//      function template-ids, but excluting non-static class members, expressed
//      (ignoring parentheses) as & id-expression, except that the & may be
//      omitted if the name refers to a function or array and shall be omitted
//      if the corresopnding template-parameter is a reference; or
namespace addr_of_obj_or_func {
  template <int* p> struct X0 { }; // expected-note 4{{here}}
  template <int (*fp)(int)> struct X1 { };
  template <int &p> struct X2 { }; // expected-note 4{{here}}
  template <const int &p> struct X2k { }; // expected-note {{here}}
  template <int (&fp)(int)> struct X3 { }; // expected-note 4{{here}}

  int i = 42;
  int iarr[10];
  int f(int i);
  const int ki = 9; // expected-note 5{{here}}
  __thread int ti = 100; // expected-note 2{{here}}
  static int f_internal(int); // expected-note 4{{here}}
  template <typename T> T f_tmpl(T t);

  void test() {
    X0<i> x0a; // expected-error {{must have its address taken}}
    X0<&i> x0a_addr;
    X0<iarr> x0b;
    X0<&iarr> x0b_addr; // expected-error {{cannot be converted to a value of type 'int *'}}
    X0<ki> x0c; // expected-error {{must have its address taken}} expected-warning {{internal linkage is a C++11 extension}}
    X0<&ki> x0c_addr; // expected-error {{cannot be converted to a value of type 'int *'}} expected-warning {{internal linkage is a C++11 extension}}
    X0<&ti> x0d_addr; // expected-error {{refers to thread-local object}}
    X1<f> x1a;
    X1<&f> x1a_addr;
    X1<f_tmpl> x1b;
    X1<&f_tmpl> x1b_addr;
    X1<f_tmpl<int> > x1c;
    X1<&f_tmpl<int> > x1c_addr;
    X1<f_internal> x1d; // expected-warning {{internal linkage is a C++11 extension}}
    X1<&f_internal> x1d_addr; // expected-warning {{internal linkage is a C++11 extension}}
    X2<i> x2a;
    X2<&i> x2a_addr; // expected-error {{address taken}}
    X2<iarr> x2b; // expected-error {{cannot bind to template argument of type 'int [10]'}}
    X2<&iarr> x2b_addr; // expected-error {{address taken}}
    X2<ki> x2c; // expected-error {{ignores qualifiers}} expected-warning {{internal linkage is a C++11 extension}}
    X2k<ki> x2kc; // expected-warning {{internal linkage is a C++11 extension}}
    X2k<&ki> x2kc_addr; // expected-error {{address taken}} expected-warning {{internal linkage is a C++11 extension}}
    X2<ti> x2d_addr; // expected-error {{refers to thread-local object}}
    X3<f> x3a;
    X3<&f> x3a_addr; // expected-error {{address taken}}
    X3<f_tmpl> x3b;
    X3<&f_tmpl> x3b_addr; // expected-error {{address taken}}
    X3<f_tmpl<int> > x3c;
    X3<&f_tmpl<int> > x3c_addr; // expected-error {{address taken}}
    X3<f_internal> x3d; // expected-warning {{internal linkage is a C++11 extension}}
    X3<&f_internal> x3d_addr; // expected-error {{address taken}} expected-warning {{internal linkage is a C++11 extension}}

    int n; // expected-note {{here}}
    X0<&n> x0_no_linkage; // expected-error {{non-type template argument refers to object 'n' that does not have linkage}}
    struct Local { static int f() {} }; // expected-note {{here}}
    X1<&Local::f> x1_no_linkage; // expected-error {{non-type template argument refers to function 'f' that does not have linkage}}
  }
}

//   -- a constant expression that evaluates to a null pointer value (4.10); or
//   -- a constant expression that evaluates to a null member pointer value
//      (4.11); or
//   -- a pointer to member expressed as described in 5.3.1.

namespace bad_args {
  template <int* N> struct X0 { }; // expected-note 2{{template parameter is declared here}}
  int i = 42;
  X0<&i + 2> x0a; // expected-error{{non-type template argument does not refer to any declaration}}
  int* iptr = &i;
  X0<iptr> x0b; // expected-error{{non-type template argument for template parameter of pointer type 'int *' must have its address taken}}
}
