Home | History | Annotate | Download | only in temp.param
      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 // A type-parameter defines its identifier to be a type-name (if
      6 // declared with class or typename) or template-name (if declared with
      7 // template) in the scope of the template declaration.
      8 template<typename T> struct X0 {
      9   T* value;
     10 };
     11 
     12 template<template<class T> class Y> struct X1 {
     13   Y<int> value;
     14 };
     15 
     16 // [Note: because of the name lookup rules, a template-parameter that
     17 // could be interpreted as either a non-type template-parameter or a
     18 // type-parameter (because its identifier is the name of an already
     19 // existing class) is taken as a type-parameter. For example,
     20 class T { /* ... */ };  // expected-note{{candidate constructor (the implicit copy constructor) not viable}}
     21 #if __cplusplus >= 201103L // C++11 or later
     22 // expected-note@-2 {{candidate constructor (the implicit move constructor) not viable}}
     23 #endif
     24 
     25 int i;
     26 
     27 template<class T, T i> struct X2 {
     28   void f(T t)
     29   {
     30     T t1 = i; //template-parameters T and i
     31     ::T t2 = ::i; // global namespace members T and i  \
     32     // expected-error{{no viable conversion}}
     33   }
     34 };
     35 
     36 namespace PR6831 {
     37   namespace NA { struct S; }
     38   namespace NB { struct S; }
     39 
     40   using namespace NA;
     41   using namespace NB;
     42 
     43   template <typename S> void foo();
     44   template <int S> void bar();
     45   template <template<typename> class S> void baz();
     46 }
     47