[cfe-dev] #pragma diagnostic ignored and template code

Louis Gerbarg lgerbarg at gmail.com
Fri Sep 10 04:09:18 PDT 2010


On Thu, Sep 9, 2010 at 4:40 PM, Douglas Gregor <dgregor at apple.com> wrote:
>
> On Sep 9, 2010, at 11:29 AM, Chris Lattner wrote:
>
>>
>> On Sep 9, 2010, at 9:55 AM, Luc Bourhis wrote:
>>
>>> Hi,
>>>
>>> consider the trivial source code
>>>
>>> ==== warning.cpp ====
>>>
>>> #pragma clang diagnostic push
>>> #pragma clang diagnostic ignored "-Wtautological-compare"
>>>
>>> unsigned foo(unsigned x) {
>>> if (x < 0) return -x;
>>> return x;
>>> }
>>>
>>> #pragma clang diagnostic pop
>> ...
>>> Is that the intended behaviour?
>>
>> No, it's a bug.  A similar problem occurs with inline methods in classes:
>>
>> class foo {
>>  #pragma clang diagnostic push
>>  #pragma clang diagnostic ignored "-Wtautological-compare"
>>
>>  void bar() {
>>    ...
>>  }
>>
>>  #pragma .. pop
>> };
>>
>> This is certainly a bug, but it's not trivial to fix.
>
> FWIW, the fix would require us to keep track of the source ranges covering each push/pop. Then, when determining whether to suppress a diagnostic during template instantiation/inline member processing/etc., we would perform a binary search in those source ranges to determine the active pragmas, diagnostic flags, etc.

How does this effect similiar pragmas, like align? For example:

#pragma pack(push,1)

unsigned foo(unsigned x) {
 if (x < 0) return -x;
 return x;
}

#pragma pack(pop)

If that works correctly it seems like we could use the same
infrastructure for storing the alignment info during template
instantiation. If it doesn't work, then it would probably make some
sense to figure out how to solve them both generically, since not
honoring the alignment info could be a pretty serious issue for some
codebases.

Also, is there any chance this could be worked around by using
_Pragma()? That would be the solution in a C macro, but I am unsure
what the semantics of _Pragma() with respect to template instantiation
are.

Louis




More information about the cfe-dev mailing list