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)