diff options
author | Jason Merrill <jason@redhat.com> | 2013-04-22 15:19:55 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2013-04-22 15:19:55 -0400 |
commit | d3d50a6185a224de3fb02c157cbf447f839d18e6 (patch) | |
tree | 1ad698dc021c903b74e8c2bd661327f9c6bd9cdd /gcc | |
parent | e361d18df77ed06994441e0b0d0c33409ede5b63 (diff) | |
download | gcc-d3d50a6185a224de3fb02c157cbf447f839d18e6.zip gcc-d3d50a6185a224de3fb02c157cbf447f839d18e6.tar.gz gcc-d3d50a6185a224de3fb02c157cbf447f839d18e6.tar.bz2 |
N3648
* parser.c (cp_parser_lambda_introducer): Make lambda capture init
pedwarn unconditional except in C++1y mode.
From-SVN: r198156
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/parser.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/lambda/lambda-init.C | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/lambda-deduce-mult.C (renamed from gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext.C) | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/lambda-init.C | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/lambda-init1.C | 13 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/lambda-init2.C | 13 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/lambda-init3.C | 11 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/lambda-init4.C | 14 |
9 files changed, 68 insertions, 12 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index dffab2c..34f207f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2013-04-22 Jason Merrill <jason@redhat.com> + N3648 + * parser.c (cp_parser_lambda_introducer): Make lambda capture init + pedwarn unconditional except in C++1y mode. + * semantics.c (potential_constant_expression_1): Don't crash on 'this' in NSDMI. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 1893482..1fbc9bd 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -8518,9 +8518,10 @@ cp_parser_lambda_introducer (cp_parser* parser, tree lambda_expr) { /* An explicit expression exists. */ cp_lexer_consume_token (parser->lexer); - pedwarn (input_location, OPT_Wpedantic, - "ISO C++ does not allow initializers " - "in lambda expression capture lists"); + if (cxx_dialect < cxx1y) + pedwarn (input_location, 0, + "lambda capture initializers " + "only available with -std=c++1y or -std=gnu++1y"); capture_init_expr = cp_parser_assignment_expression (parser, /*cast_p=*/true, &idk); diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-init.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-init.C deleted file mode 100644 index 03c94e9..0000000 --- a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-init.C +++ /dev/null @@ -1,8 +0,0 @@ -// Test for the explicit initializer extension -// { dg-options "-std=c++0x" } - -int main() -{ - int j = [i = 2]{sizeof(i); return i;}(); - return (j != 2); -} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext.C b/gcc/testsuite/g++.dg/cpp1y/lambda-deduce-mult.C index 9b5ab79..1181a80 100644 --- a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext.C +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-deduce-mult.C @@ -1,7 +1,7 @@ // Testcase for an extension to allow return type deduction when the lambda // contains more than just a single return-statement. -// { dg-options -std=c++0x } +// { dg-options -std=c++1y } // { dg-do run } bool b; diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-init.C b/gcc/testsuite/g++.dg/cpp1y/lambda-init.C new file mode 100644 index 0000000..a443642 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-init.C @@ -0,0 +1,8 @@ +// Test for the explicit initializer extension of C++1y +// { dg-options "-std=c++1y" } + +int main() +{ + int j = [i = 2]{sizeof(i); return i;}(); + return (j != 2); +} diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-init1.C b/gcc/testsuite/g++.dg/cpp1y/lambda-init1.C new file mode 100644 index 0000000..6411fca --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-init1.C @@ -0,0 +1,13 @@ +// N3648: capture init +// { dg-options "-std=c++1y -w" } +// { dg-do run } + +int main() +{ + int x = 41; + auto r = [x = x+1]{ return x; }(); + if (r != 42) __builtin_abort(); + + static auto *p = &r; + [&x=r]{ if (&x != p) __builtin_abort(); }(); +} diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-init2.C b/gcc/testsuite/g++.dg/cpp1y/lambda-init2.C new file mode 100644 index 0000000..068621d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-init2.C @@ -0,0 +1,13 @@ +// N3648: redundancy and capture init +// { dg-options "-std=c++1y -pedantic-errors" } + +int main() +{ + int x = 42; + [=,x]{}; // { dg-error "redundant" } + [=,&x]{}; + [&,&x]{}; // { dg-error "redundant" } + [&,x]{}; + [=,x=24]{}; + [&,&r=x]{}; +} diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-init3.C b/gcc/testsuite/g++.dg/cpp1y/lambda-init3.C new file mode 100644 index 0000000..9044be6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-init3.C @@ -0,0 +1,11 @@ +// N3648: capture init at non-block scope +// { dg-options "-std=c++1y -w" } +// { dg-do run } + +int i = 42; +int j = [x=i]{ return x; }(); + +int main() +{ + if (j != 42) __builtin_abort(); +} diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-init4.C b/gcc/testsuite/g++.dg/cpp1y/lambda-init4.C new file mode 100644 index 0000000..da4ea37 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-init4.C @@ -0,0 +1,14 @@ +// N3648: capture init example from paper +// { dg-options "-std=c++1y" } +// { dg-do run } + +int x = 4; +auto y = [&r = x, x = x+1]()->int { + r += 2; + return x+2; +}(); // Updates ::x to 6, and initializes y to 7. + +int main() +{ + if (x != 6 || y != 7) __builtin_abort(); +} |