Home | History | Annotate | Download | only in temp.variadic
      1 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
      2 
      3 // Check for template type parameter pack (mis-)matches with template
      4 // type parameters.
      5 template<typename ...T> struct X0t;
      6 template<typename ...T> struct X0t;
      7 
      8 template<typename ...T> struct X1t; // expected-note{{previous template type parameter pack declared here}}
      9 template<typename T> struct X1t; // expected-error{{template type parameter conflicts with previous template type parameter pack}}
     10 
     11 template<typename T> struct X2t; // expected-note{{previous template type parameter declared here}}
     12 template<typename ...T> struct X2t; // expected-error{{template type parameter pack conflicts with previous template type parameter}}
     13 
     14 template<template<typename ...T> class> struct X0t_intt;
     15 template<template<typename ...T> class> struct X0t_intt;
     16 
     17 template<template<typename ...T> class> struct X1t_intt; // expected-note{{previous template type parameter pack declared here}}
     18 template<template<typename T> class> struct X1t_intt; // expected-error{{template type parameter conflicts with previous template type parameter pack}}
     19 
     20 template<template<typename T> class> struct X2t_intt; // expected-note{{previous template type parameter declared here}}
     21 template<template<typename ...T> class> struct X2t_intt; // expected-error{{template type parameter pack conflicts with previous template type parameter}}
     22 
     23 template<int ...Values> struct X1nt; // expected-note{{previous non-type template parameter pack declared here}}
     24 template<int Values> struct X1nt; // expected-error{{non-type template parameter conflicts with previous non-type template parameter pack}}
     25 
     26 template<template<class T> class> class X1tt; // expected-note{{previous template template parameter declared here}}
     27 template<template<class T> class...> class X1tt; // expected-error{{template template parameter pack conflicts with previous template template parameter}}
     28 
     29 // Check for matching with out-of-line definitions
     30 namespace rdar8859985 {
     31   template<typename ...> struct tuple { };
     32   template<int ...> struct int_tuple { };
     33 
     34   template<typename T>
     35   struct X {
     36     template<typename ...Args1, int ...Indices1>
     37     X(tuple<Args1...>, int_tuple<Indices1...>);
     38   };
     39 
     40   template<typename T>
     41   template<typename ...Args1, int ...Indices1>
     42   X<T>::X(tuple<Args1...>, int_tuple<Indices1...>) {}
     43 }
     44