12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RUN: %clang_cc1 -std=c++11 -fblocks -fsyntax-only -verify %s
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests the use of blocks with variadic templates.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template<typename ...Args>
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int f0(Args ...args) {
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ^ {
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return sizeof...(Args);
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }() + ^ {
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return sizeof...(args);
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }();
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdochtemplate<typename ...Args>
142385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochint f1(Args ...args) {
152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  return ^ {
162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    return f0(args...);
172385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }();
182385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochtemplate int f0(int, float, double);
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template int f1(const char*, int, float, double);
222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template<typename ...Args>
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int f2(Args ...args) {
252385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  return ^(Args ...block_args) {
262385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    return f1(block_args...);
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }(args + 0 ...);
28a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
29a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
30a3f7b4e666c476898878fa745f637129375cd889Ben Murdochtemplate int f2(const char*, int, float, double);
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template<typename ...Args>
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int f3(Args ...args) {
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return ^(Args *...block_args) {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return f1(block_args...);
36a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  }(&args...);
3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template int f3(const char*, int, float, double);
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template<typename ...Args>
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int PR9953(Args ...args) {
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ^(Args *...block_args) {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return f1(block_args); // expected-error{{expression contains unexpanded parameter pack 'block_args'}}
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }(&args...);
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)