Home | History | Annotate | Download | only in Parser
      1 // RUN: %clang_cc1 -fsyntax-only -verify %s
      2 
      3 // Errors
      4 export class foo { };   // expected-error {{expected template}}
      5 template  x;            // expected-error {{C++ requires a type specifier for all declarations}} \
      6                         // expected-error {{does not refer}}
      7 export template x;      // expected-error {{expected '<' after 'template'}}
      8 export template<class T> class x0; // expected-warning {{exported templates are unsupported}}
      9 template < ;            // expected-error {{expected template parameter}} \
     10 // expected-error{{expected ',' or '>' in template-parameter-list}} \
     11 // expected-warning {{declaration does not declare anything}}
     12 template <int +> struct x1; // expected-error {{expected ',' or '>' in template-parameter-list}}
     13 
     14 // verifies that we only walk to the ',' & still produce errors on the rest of the template parameters
     15 template <int +, T> struct x2; // expected-error {{expected ',' or '>' in template-parameter-list}} \
     16                                 expected-error {{expected unqualified-id}}
     17 template<template<int+>> struct x3; // expected-error {{expected ',' or '>' in template-parameter-list}} \
     18                                          expected-error {{template template parameter requires 'class' after the parameter list}}
     19 template <template X> struct Err1; // expected-error {{expected '<' after 'template'}} \
     20 // expected-error{{extraneous}}
     21 template <template <typename> > struct Err2;       // expected-error {{template template parameter requires 'class' after the parameter list}}
     22 template <template <typename> Foo> struct Err3;    // expected-error {{template template parameter requires 'class' after the parameter list}}
     23 
     24 // Template function declarations
     25 template <typename T> void foo();
     26 template <typename T, typename U> void foo();
     27 
     28 // Template function definitions.
     29 template <typename T> void foo() { }
     30 
     31 // Template class (forward) declarations
     32 template <typename T> struct A;
     33 template <typename T, typename U> struct b;
     34 template <typename> struct C;
     35 template <typename, typename> struct D;
     36 
     37 // Forward declarations with default parameters?
     38 template <typename T = int> class X1;
     39 template <typename = int> class X2;
     40 
     41 // Forward declarations w/template template parameters
     42 template <template <typename> class T> class TTP1;
     43 template <template <typename> class> class TTP2;
     44 template <template <typename> class T = foo> class TTP3; // expected-error{{must be a class template}}
     45 template <template <typename> class = foo> class TTP3; // expected-error{{must be a class template}}
     46 template <template <typename X, typename Y> class T> class TTP5;
     47 
     48 // Forward declarations with non-type params
     49 template <int> class NTP0;
     50 template <int N> class NTP1;
     51 template <int N = 5> class NTP2;
     52 template <int = 10> class NTP3;
     53 template <unsigned int N = 12u> class NTP4;
     54 template <unsigned int = 12u> class NTP5;
     55 template <unsigned = 15u> class NTP6;
     56 template <typename T, T Obj> class NTP7;
     57 
     58 // Template class declarations
     59 template <typename T> struct A { };
     60 template <typename T, typename U> struct B { };
     61 
     62 // Template parameter shadowing
     63 template<typename T, // expected-note{{template parameter is declared here}}
     64          typename T> // expected-error{{declaration of 'T' shadows template parameter}}
     65   void shadow1();
     66 
     67 template<typename T> // expected-note{{template parameter is declared here}}
     68 void shadow2(int T); // expected-error{{declaration of 'T' shadows template parameter}}
     69 
     70 template<typename T> // expected-note{{template parameter is declared here}}
     71 class T { // expected-error{{declaration of 'T' shadows template parameter}}
     72 };
     73 
     74 template<int Size> // expected-note{{template parameter is declared here}}
     75 void shadow3(int Size); // expected-error{{declaration of 'Size' shadows template parameter}}
     76 
     77 // <rdar://problem/6952203>
     78 template<typename T> // expected-note{{here}}
     79 struct shadow4 {
     80   int T; // expected-error{{shadows}}
     81 };
     82 
     83 template<typename T> // expected-note{{here}}
     84 struct shadow5 {
     85   int T(int, float); // expected-error{{shadows}}
     86 };
     87 
     88 // Non-type template parameters in scope
     89 template<int Size>
     90 void f(int& i) {
     91   i = Size;
     92   Size = i; // expected-error{{expression is not assignable}}
     93 }
     94 
     95 template<typename T>
     96 const T& min(const T&, const T&);
     97 
     98 void f2() {
     99   int x;
    100   A< typeof(x>1) > a;
    101 }
    102 
    103 
    104 // PR3844
    105 template <> struct S<int> { }; // expected-error{{explicit specialization of non-template struct 'S'}}
    106 
    107 namespace PR6184 {
    108   namespace N {
    109     template <typename T>
    110     void bar(typename T::x);
    111   }
    112 
    113   template <typename T>
    114   void N::bar(typename T::x) { }
    115 }
    116