// RUN: %clang_cc1 -std=c++1z -verify %s

template<typename ...T> constexpr auto sum(T ...t) { return (... + t); }
template<typename ...T> constexpr auto product(T ...t) { return (t * ...); }
template<typename ...T> constexpr auto all(T ...t) { return (true && ... && t); }
template<typename ...T> constexpr auto all2(T ...t) { return (t && ... && true); }

int k1 = (1 + ... + 2); // expected-error {{does not contain any unexpanded parameter packs}}
int k2 = (1 + ...); // expected-error {{does not contain any unexpanded parameter packs}}
int k3 = (... + 2); // expected-error {{does not contain any unexpanded parameter packs}}

struct A { A(int); friend A operator+(A, A); A operator-(A); A operator()(A); A operator[](A); };
A operator*(A, A);

template<int ...N> void bad1() { (N + ... + N); } // expected-error {{unexpanded parameter packs in both operands}}
// FIXME: it would be reasonable to support this as an extension.
template<int ...N> void bad2() { (2 * N + ... + 1); } // expected-error {{expression not permitted as operand}}
template<int ...N> void bad3() { (2 + N * ... * 1); } // expected-error {{expression not permitted as operand}}
template<int ...N, int ...M> void bad4(int (&...x)[N]) { (N + M * ... * 1); } // expected-error {{expression not permitted as operand}}
template<int ...N, int ...M> void fixed4(int (&...x)[N]) { ((N + M) * ... * 1); }
template<typename ...T> void bad4a(T ...t) { (t * 2 + ... + 1); } // expected-error {{expression not permitted as operand}}
template<int ...N> void bad4b() { (A(0) + A(N) + ...); } // expected-error {{expression not permitted as operand}}
template<int ...N> void bad4c() { (A(0) - A(N) + ...); } // expected-error {{expression not permitted as operand}}
template<int ...N> void bad4d() { (A(0)(A(0)) + ... + A(0)[A(N)]); }

// Parens are mandatory.
template<int ...N> void bad5() { N + ...; } // expected-error {{expected expression}} expected-error +{{}}
template<int ...N> void bad6() { ... + N; } // expected-error {{expected expression}}
template<int ...N> void bad7() { N + ... + N; } // expected-error {{expected expression}} expected-error +{{}}

// Must have a fold-operator in the relevant places.
template<int ...N> int bad8() { return (N + ... * 3); } // expected-error {{operators in fold expression must be the same}}
template<int ...N> int bad9() { return (3 + ... * N); } // expected-error {{operators in fold expression must be the same}}
template<int ...N> int bad10() { return (3 ? ... : N); } // expected-error +{{}} expected-note {{to match}}
template<int ...N> int bad11() { return (N + ... 0); } // expected-error {{expected a foldable binary operator}} expected-error {{expected expression}}
template<int ...N> int bad12() { return (... N); } // expected-error {{expected expression}}

template<typename ...T> void as_operand_of_cast(int a, T ...t) {
  return
    (int)(a + ... + undeclared_junk) + // expected-error {{undeclared}} expected-error {{does not contain any unexpanded}}
    (int)(t + ... + undeclared_junk) + // expected-error {{undeclared}}
    (int)(... + undeclared_junk) + // expected-error {{undeclared}} expected-error {{does not contain any unexpanded}}
    (int)(undeclared_junk + ...) + // expected-error {{undeclared}}
    (int)(a + ...) + // expected-error {{does not contain any unexpanded}}
    (int)(a, ...) + // expected-error {{does not contain any unexpanded}}
    (int)(..., a) + // expected-error {{does not contain any unexpanded}}
    (int)(a, ..., undeclared_junk) + // expected-error {{undeclared}} expected-error {{does not contain any unexpanded}}
    (int)(t, ...) +
    (int)(..., t) +
    (int)(t, ..., a);
}

// fold-operator can be '>' or '>>'.
template <int... N> constexpr bool greaterThan() { return (N > ...); }
template <int... N> constexpr int rightShift() { return (N >> ...); }

static_assert(greaterThan<2, 1>());
static_assert(rightShift<10, 1>() == 5);

template <auto V> constexpr auto Identity = V;

// Support fold operators within templates.
template <int... N> constexpr int nestedFoldOperator() {
  return Identity<(Identity<0> >> ... >> N)> +
    Identity<(N >> ... >> Identity<0>)>;
}

static_assert(nestedFoldOperator<3, 1>() == 1);

// A fold-expression is a primary-expression.
template <typename T, typename... Ts>
constexpr auto castSum(Ts... Args) {
  return (T)(Args + ...).Value; // expected-error{{member reference base type 'int' is not a structure or union}}
}

template <typename... Ts>
constexpr auto simpleSum(Ts... Args) {
  return (... + Args).Value; // expected-error{{member reference base type 'int' is not a structure or union}}
}

void prim() {
  castSum<int>(1, 2);
  // expected-note@-1{{in instantiation of function template specialization}}
  simpleSum(1, 2);
  // expected-note@-1{{in instantiation of function template specialization}}

  struct Number {
    int Value;
    constexpr Number operator+(Number Rhs) const { return {Rhs.Value + Value}; }
  };

  static_assert(castSum<long>(Number{1}, Number{2}) == 3);
  static_assert(simpleSum(Number{1}, Number{2}) == 3);
}
