aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2014-06-26 14:15:36 -0400
committerJason Merrill <jason@gcc.gnu.org>2014-06-26 14:15:36 -0400
commitdaa04b0ad91e1994e53bcad3930d2bf4ae8ef04d (patch)
tree990824d09a9ea0a4b8fc22d0d4fa5540abc9e645
parentda73100b48932e7e01669993031fd694ed1590b2 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/parser.c23
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/range-for1.C12
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);
+ }
+}