> I like this a lot! How does it fare against more complicated macros, though?

As is it doesn't display very helpful diagnostics for complicated macros like 
these, and even crashes on some.
A good reason not to try to do textual parsing.


> 
> #define CASE1 case 1
> #define CASE(x) case x
> #define MULTI_CASE(x,y) case x: case y:
> 
> switch (x) {
> CASE1: break;
> CASE(1U): break;
> MULTI_CASE(2,2): break;
> case 2: break;
> }
> 
> As for multi-line case statements, I'd be inclined to simply fall back to the 
> dumb version of the warning, rather than trying to format it nicely in the 
> output. We already have a note showing where the relevant code is. And I 
> wouldn't be worried about casts -- if they're there, the user probably 
> thought they were making a difference. (I'd actually be more worried about 
> things like parens, but I'd err on the side of including them anyway.)
> 
> Jordy
> 
> 
> On May 15, 2012, at 12:05, Terry Long wrote:
> 
>> Hi all,
>> 
>> This patch mostly inspired by http://llvm.org/bugs/show_bug.cgi?id=9243 -- 
>> poor "duplicate case" diagnostic with enums
>> 
>> Previously the diagnostic for duplicate case values in switch statements was 
>> always something like "duplicate case value '5'" 
>> 
>> What my patch changes:
>> When the duplicate case is exactly the same in textual representation (in 
>> source code), the diagnostic will use that exact text in the diagnostic.
>> e.g. using MyEnum twice gives the diagnostic "duplicate case value 'MyEnum'"
>> 
>> If the textual representations differ, the new diagnostic explicitly states 
>> they are equal to the same value
>> e.g. using MyEnum (equal to 5) and 5, the diagnostic displays "duplicate 
>> case value: 'MyEnum' and '5' both equal '5'"
>> 
>> The patch does the same for any valid expression in a case statement 
>> (including macros, const ints, char literals, etc.).
>> 
>> Concerns with my patch:
>> 1. Multiline case statements, although unusual, will be printed out in the 
>> diagnostic exactly as they appear in the source. I'm not sure if this is a 
>> real issue. Possible solution would be checking if it spans multiple lines. 
>> If so, the diagnostic could be "duplicate case value: both expressions equal 
>> 'x'".
>> e.g.
>> case 1 +
>> 2 +
>> 3:
>> 
>> 2. If a case statement includes a cast, the cast will also be included in 
>> the diagnostic. Sometimes this inclusion is helpful, for example in 
>> situations where the cast will cause an overflow (such as "(char)256" and 
>> "0"). Other times it is irrelevant, such as "(int)7" and "7", where a simple 
>> diagnostic of "duplicate case value '7'" makes more sense. I'm also not sure 
>> if this is an issue.
>> 
>> 
>> Thanks!
>> 
>> Terry Long
>> 
>> <PR9243.patch>_______________________________________________
>> 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

Reply via email to