On Tuesday 20 February 2018 03:14 PM, Jakub Jelinek wrote:
> On Mon, Feb 19, 2018 at 09:59:00PM +0530, Siddhesh Poyarekar wrote:
>> The C++ frontend generates a break that results in the fallthrough
>> warning misfiring in nested switch blocks where cases in the inner
>> switch block return, rendering the break pointless.  The fallthrough
>> detection in finish_break_stmt does not work either because the
>> condition is encoded as an IF_STMT and not a COND_EXPR.
>>
>> Fix this by adding a condition for IF_STMT in the
>> langhooks.block_may_fallthru for C++.  Fix tested on x86_64.  Full
>> testsuite run is in progress.
>>
>> Siddhesh
>>
>> gcc/cp
>>      * cp-objcp-common.c (cxx_block_may_fallthru): Add case for
>>      IF_STMT.
>>
>> gcc/testsuite
>>      * g++.dg/nested-switch.C: New test case.
> 
> C++ testcase shouldn't be put directly into g++.dg/ (though yes, several
> have been), but into a subdirectory.  In this case, because it is a (bogus)
> warning, it should best go into g++.dg/warn/, and perhaps best named as
> g++.dg/warn/Wimplicit-fallthrough-3.C .
> 
>> --- /dev/null
>> +++ b/gcc/testsuite/g++.dg/nested-switch.C
>> @@ -0,0 +1,30 @@
>> +// Verify that there are no spurious warnings in nested switch statements 
>> due
>> +// to the unnecessary break in the inner switch block.
>> +// { dg-do compile }
>> +// { dg-options "-Werror=implicit-fallthrough" } */
> 
> I'd go just for -Wimplicit-fallthrough.
> 
>> +
>> +int
>> +foo (int c1, int c2, int c3)
>> +{
>> +  switch (c2)
>> +    {
>> +    case 0:   
>> +      switch (c3) {
> 
> And turn the above line into
>       switch (c3) {   // { dg-bogus "may fall through" }
> 
>> +    case 0:
>> +      if (c1)
>> +        return 1;
>> +      else
>> +        return 2;
>> +      break;
>> +
>> +    default:
>> +      return 3;
>> +      }
>> +
>> +    case 1: 
>> +      return 4;
>> +    default:
>> +      return 5;
>> +      break;
>> +    }
>> +}
> 
> Ok for trunk with those nits, thanks.

Thanks, fixed up and pushed.

Siddhesh

Reply via email to