[cfe-commits] [patch] Better diagnostics in for-range expressions.
Matt Beaumont-Gay
matthewbg at google.com
Fri Jun 8 11:16:55 PDT 2012
ENOPATCH
On Fri, Jun 8, 2012 at 11:13 AM, Sam Panzer <panzer at google.com> 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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
More information about the cfe-commits
mailing list