Hello.
At the moment compilation of a range-based for in c++98 fails with the
error message:
foo.cpp: In function 'int foo()':
foo.cpp:4:13: error: expected initializer before ':' token
foo.cpp:6:1: error: expected primary-expression before '}' token
foo.cpp:6:1: error: expected ';' before '}' token
foo.cpp:6:1: error: expected primary-expression before '}' token
foo.cpp:6:1: error: expected ')' before '}' token
foo.cpp:6:1: error: expected primary-expression before '}' token
foo.cpp:6:1: error: expected ';' before '}' token
This is quite unreadable and not very informative.
In order to fix this I applied a patch that gives the output:
foo.cpp: In function 'int foo()':
foo.cpp:4:11: error: range-based for only available with -std=c++0x or
-std=gnu++0x
but additionally it changes the output of g++.old-deja/g++.mike/for2.C
when compiled in c++98 mode.
Here there are two problems
#1 - It doesn't change the output of g++.old-deja/g++.mike/for2.C when
compiled in c++0x-mode
#2 - It does change the output of g++.old-deja/g++.mike/for2.C when
compiled in c++98-mode
#1 is a problem since for2.C only contains old-style for loops and so it
is ridiculous to say things like:
for2.C:4:16: error: types may not be defined in range-based for loops
and my patch extends that behavior to the c++98 case where it makes even
less sense...
Now, the good part is that solving problem #1 should solve problem #2 as
well.
(and yes, I know I shouldn't use error but I have yet to find the
location of the colon for error_at)
/MF
Index: gcc/cp/parser.c
===================================================================
--- gcc/cp/parser.c (revision 164381)
+++ gcc/cp/parser.c (working copy)
@@ -8666,6 +8666,11 @@
/* The next token should be `:'. */
if (cp_lexer_next_token_is_not (parser->lexer, CPP_COLON))
cp_parser_simulate_error (parser);
+ else if (cxx_dialect == cxx98)
+ {
+ error ("range-based for only available with -std=c++0x or -std=gnu++0x");
+ return NULL_TREE;
+ }
/* Check if it is a range-based for */
if (!cp_parser_parse_definitely (parser))
@@ -8922,10 +8927,7 @@
/* Look for the `('. */
cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
- if (cxx_dialect == cxx0x)
- statement = cp_parser_range_for (parser);
- else
- statement = NULL_TREE;
+ statement = cp_parser_range_for (parser);
if (statement == NULL_TREE)
statement = cp_parser_c_for (parser);
int foo()
{
int v[] = { 1 };
for (int i : v)
return i;
}