ENOPATCH On Fri, Jun 8, 2012 at 11:13 AM, Sam Panzer <[email protected]> wrote: > Hi, > > Richard Smith suggested that I try to improve the diagnostic emitted when > Clang encounters certain kinds of invalid C+11 ranged-based for loops. > >> When a pointer to a container is used as the range in a range-based for, >> Clang's diagnostic is not awesome: >> >>> struct S { int *begin(); int *end(); }; >>> void f(S *p) { >>> for (auto i : p) {} >>> } >>> tmp.cpp:3:15: error: use of undeclared identifier 'begin' >>> for (auto i : p) {} } >>> ^ >>> tmp.cpp:3:15: note: range has type 'S *' >> >> >> We should do better than that, and suggest inserting the missing '*'. > > > This patch replaces the errors complaining about undeclared identifiers with > an error specific to ranged-for loops, along with an explanatory note. I > also updated the existing test cases to reflect the change. For example, the > above code now generates this: > >> test.cpp:3:15: error: invalid range expression of type 'S *' >> for (auto i : p) {} >> ^ ~ >> test.cpp:3:16: note: range expression is of type 'S *'; did you >> mean to dereference it with '*'? >> for (auto i : p) {} >> ^ >> * >> test.cpp:3:14: note: no viable 'end' function for range of type >> 'S *' >> for (auto i : p) {} > > > I hope that this is helpful, and comments are always welcome. > > -Sam > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
