xref: /llvm-project/clang/test/SemaTemplate/stmt-expr.cpp (revision 6eb9b9e593b133fe766a31442df4ad4a110e0fa2)
1*6eb9b9e5SRichard Smith // RUN: %clang_cc1 -verify %s
2*6eb9b9e5SRichard Smith 
3*6eb9b9e5SRichard Smith // FIXME: We could in principle support cases like this (particularly, cases
4*6eb9b9e5SRichard Smith // where the statement-expression contains no labels).
f1()5*6eb9b9e5SRichard Smith template <typename... T> void f1() {
6*6eb9b9e5SRichard Smith   int arr[] = {
7*6eb9b9e5SRichard Smith     ({
8*6eb9b9e5SRichard Smith       T(); // expected-error {{unexpanded parameter pack}}
9*6eb9b9e5SRichard Smith     }) ... // expected-error {{does not contain any unexpanded parameter packs}}
10*6eb9b9e5SRichard Smith   };
11*6eb9b9e5SRichard Smith }
12*6eb9b9e5SRichard Smith 
13*6eb9b9e5SRichard Smith // FIXME: The error for this isn't ideal; it'd be preferable to say that pack
14*6eb9b9e5SRichard Smith // expansion of a statement expression is not permitted.
f2()15*6eb9b9e5SRichard Smith template <typename... T> void f2() {
16*6eb9b9e5SRichard Smith   [] {
17*6eb9b9e5SRichard Smith     int arr[] = {
18*6eb9b9e5SRichard Smith       T() + ({
19*6eb9b9e5SRichard Smith       foo:
20*6eb9b9e5SRichard Smith         T t; // expected-error {{unexpanded parameter pack}}
21*6eb9b9e5SRichard Smith         goto foo;
22*6eb9b9e5SRichard Smith         0;
23*6eb9b9e5SRichard Smith       }) ...
24*6eb9b9e5SRichard Smith     };
25*6eb9b9e5SRichard Smith   };
26*6eb9b9e5SRichard Smith }
27*6eb9b9e5SRichard Smith 
f3()28*6eb9b9e5SRichard Smith template <typename... T> void f3() {
29*6eb9b9e5SRichard Smith   ({
30*6eb9b9e5SRichard Smith     int arr[] = {
31*6eb9b9e5SRichard Smith       [] {
32*6eb9b9e5SRichard Smith       foo:
33*6eb9b9e5SRichard Smith         T t; // OK, expanded within compound statement
34*6eb9b9e5SRichard Smith         goto foo;
35*6eb9b9e5SRichard Smith         return 0;
36*6eb9b9e5SRichard Smith       } ...
37*6eb9b9e5SRichard Smith     };
38*6eb9b9e5SRichard Smith   });
39*6eb9b9e5SRichard Smith }
40