>> Ah, yes. So we should share the parsing of the decl-specifier-seq with the >> C-style for loop, which allows us to avoid the tentative parsing. > > That was my original idea, but the C-style loop calls > cp_parser_simple_declaration(), that shouts at the ':'. So we should > either modify it to accept the ':' or split it in two. Both options > are well beyond my intentions.
I just implemented "fast enumeration" (ie, "for (object in array) { ... }") for Objective-C, and I was now planning on doing it for Objective-C++ too. ;-) If you're doing range-based for-loops for C++, we may as well share ideas ;-) What I've done for Objective-C fast enumeration (and what Apple did before me as well) is implemented your idea of modifying the declaration parsing to accept ':' (well, 'in' in the ObjC case) to terminate a declaration in that context: * when you start parsing the 'for', a flag is turned on in the parser that means that we are "maybe in a fast enumeration" * then, you go on parsing your usual C for loop, but the code that parses expressions/declarations has a special case for when it's "maybe in a fast enumeration", in which case it accepts "in" as terminating the expression/declaration (as well as ";"), and moreover if it finds "in" in there, it will save the declaration specially and make sure to communicate back to the for parsing code that we are "really" in a fast enumeration * when the initial expression/declaration has been parsed, the for parsing code turns off the "maybe in a fast enumeration" flag; it now knows whether it's a normal for loop or a fast enumeration one and everything is easy from there on It sounds like the same could apply to C++ range-based for-loops ? Except you use ':' instead of 'in' ? We could almost share the code - ie, set a single flag in the C++/ObjC++ parser to say we are at the beginning of a 'for' loop, and have that flag turn on recognizing ':' (for range-based loops) and 'in' (only if (dialect_objc()), for fast ObjC++ enumeration) as terminating declarations. The main disadvantage of doing things this way is making sure you won't misunderstand a ':' (or 'in') as meaning a range-based for-loop (or fast enumeration loop) when it isn't. The best defense IMO is to make sure ":" is only recognized in this way at the end of a declaration (where normally a ';' would be) (this is harder in Objective-C, but should be easier in Objective-C++). It's worth trying to think of valid cases where you'd use a ":" inside a C for loop though. Anyway, let me know if this makes any sense or if I missed everything. Am I right that the beginning of a C++ range-based for-loop is identical to a standard C for loop up until the ':' ? If not, obviously this technique won't work. ;-) Thanks