At Thu, 24 Jan 2019 09:37:41 -0500, Tom Lane <t...@sss.pgh.pa.us> wrote in 
<15760.1548340...@sss.pgh.pa.us>
> Kyotaro HORIGUCHI <horiguchi.kyot...@lab.ntt.co.jp> writes:
> > I might misunderstand something, but my compiler (gcc 7.3.1)
> > won't be quiet about omitted value even with default:.
> > ...
> 
> I would call that a compiler bug, TBH.  The code is 100% correct,
> if you intended to allow the default case to handle some enum
> values, which is perfectly reasonable coding.

Yeah, the code is correct. I had switch-enum in my mind.

We can use #pragma (or _Pragma) to apply an option to a specific
region.

====
#pragma GCC diagnostic push
#pragma GCC diagnostic warning "-Wswitch-enum"
        switch ((type) something)
        {
#pragma GCC diagnostic pop
====

but I don't find a usable form of syntax sugar to wrap this.  The
best I can think of is...


#define STRICT_SWITCH(type, value) { \
        _Pragma ("GCC diagnostic push")\
        _Pragma ("GCC diagnostic warning \"-Wswitch-enum\"")\
        switch((type) (value))

#define END_STRICT_SWITCH() \
        _Pragma ("GCC diagnostic pop") }


(The brace causes syntax error when END_ is omitted, but the
error messages is not so developer friendly...)

====
    STRICT_SWITCH(type, var)
    {
    case xxx:
    ...
    default:
      error(ERROR, (errmsg ("unexpected value %d" (int)var)));
    }
    END_STRICT_SWITCH();
====


> > Isn't it enough that at least one platform correctly warns that?
> 
> No, especially not if it's only a warning.  Many developers would
> not see it initially, and the buildfarm likely wouldn't complain
> either.

I agree that it would be bothersome for people who are working on
such platforms.

regards.

-- 
Kyotaro Horiguchi
NTT Open Source Software Center


Reply via email to