diff options
author | Jason Merrill <jason@redhat.com> | 2014-06-26 14:15:36 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2014-06-26 14:15:36 -0400 |
commit | daa04b0ad91e1994e53bcad3930d2bf4ae8ef04d (patch) | |
tree | 990824d09a9ea0a4b8fc22d0d4fa5540abc9e645 | |
parent | da73100b48932e7e01669993031fd694ed1590b2 (diff) | |
download | gcc-daa04b0ad91e1994e53bcad3930d2bf4ae8ef04d.zip gcc-daa04b0ad91e1994e53bcad3930d2bf4ae8ef04d.tar.gz gcc-daa04b0ad91e1994e53bcad3930d2bf4ae8ef04d.tar.bz2 |
N3994 Ranged-based for-loops: The Next Generation
N3994 Ranged-based for-loops: The Next Generation
* parser.c (cp_lexer_nth_token_is): New.
(cp_parser_for_init_statement): Allow "for (id : init)".
From-SVN: r212043
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/parser.c | 23 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1z/range-for1.C | 12 |
3 files changed, 41 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 124f4d6..669e714 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2014-06-26 Jason Merrill <jason@redhat.com> + + N3994 Ranged-based for-loops: The Next Generation + * parser.c (cp_lexer_nth_token_is): New. + (cp_parser_for_init_statement): Allow "for (id : init)". + 2014-06-26 Adam Butcher <adam@jessamine.co.uk> PR c++/61537 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index c440c99..426dca4 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -892,6 +892,12 @@ cp_lexer_next_token_is_keyword (cp_lexer* lexer, enum rid keyword) } static inline bool +cp_lexer_nth_token_is (cp_lexer* lexer, size_t n, enum cpp_ttype type) +{ + return cp_lexer_peek_nth_token (lexer, n)->type == type; +} + +static inline bool cp_lexer_nth_token_is_keyword (cp_lexer* lexer, size_t n, enum rid keyword) { return cp_lexer_peek_nth_token (lexer, n)->keyword == keyword; @@ -10607,6 +10613,23 @@ cp_parser_for_init_statement (cp_parser* parser, tree *decl) bool is_range_for = false; bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p; + if (cp_lexer_next_token_is (parser->lexer, CPP_NAME) + && cp_lexer_nth_token_is (parser->lexer, 2, CPP_COLON)) + { + /* N3994 -- for (id : init) ... */ + if (cxx_dialect < cxx1z) + pedwarn (input_location, 0, "range-based for loop without a " + "type-specifier only available with " + "-std=c++1z or -std=gnu++1z"); + tree name = cp_parser_identifier (parser); + tree type = cp_build_reference_type (make_auto (), /*rval*/true); + *decl = build_decl (input_location, VAR_DECL, name, type); + pushdecl (*decl); + cp_lexer_consume_token (parser->lexer); + return true; + } + + /* A colon is used in range-based for. */ parser->colon_corrects_to_scope_p = false; /* We're going to speculatively look for a declaration, falling back diff --git a/gcc/testsuite/g++.dg/cpp1z/range-for1.C b/gcc/testsuite/g++.dg/cpp1z/range-for1.C new file mode 100644 index 0000000..7e6d055 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/range-for1.C @@ -0,0 +1,12 @@ +// { dg-options "-std=c++1z -pedantic-errors" } + +extern "C" int printf (const char *, ...); +#include <initializer_list> + +int main() +{ + for (i : {1,2}) + { + printf ("%d ", i); + } +} |