From: Jason Merrill Date: Thu, 26 Jun 2014 18:15:36 +0000 (-0400) Subject: N3994 Ranged-based for-loops: The Next Generation X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=daa04b0ad91e1994e53bcad3930d2bf4ae8ef04d;p=gcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 124f4d6e30b..669e7144f68 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2014-06-26 Jason Merrill + + 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 PR c++/61537 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index c440c9937ba..426dca439de 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -891,6 +891,12 @@ cp_lexer_next_token_is_keyword (cp_lexer* lexer, enum rid keyword) return cp_lexer_peek_token (lexer)->keyword == 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) { @@ -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 00000000000..7e6d05580c8 --- /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 + +int main() +{ + for (i : {1,2}) + { + printf ("%d ", i); + } +}