1 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
2 
3 template<typename T> struct identity;
4 template<typename ...Types> struct tuple;
5 
6 template<typename T, typename U> struct is_same {
7   static const bool value = false;
8 };
9 
10 template<typename T> struct is_same<T, T> {
11   static const bool value = true;
12 };
13 
14 // There is a syntactic ambiguity when an ellipsis occurs at the end
15 // of a parameter-declaration-clause without a preceding comma. In
16 // this case, the ellipsis is parsed as part of the
17 // abstract-declarator if the type of the parameter names a template
18 // parameter pack that has not been expanded; otherwise, it is parsed
19 // as part of the parameter-declaration-clause.
20 
21 template<typename T, typename ...Types>
22 struct X0 {
23   typedef identity<T(Types...)> function_pack_1;
24   typedef identity<T(Types......)> variadic_function_pack_1; // expected-warning {{varargs}} expected-note {{pack}} expected-note {{insert ','}}
25   typedef identity<T(T...)> variadic_1;
26   typedef tuple<T(Types, ...)...> template_arg_expansion_1;
27 };
28 
29 
30 
31 // FIXME: Once function parameter packs are implemented, we can test all of the disambiguation
32