https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91285

            Bug ID: 91285
           Summary: _Pragma does not work in a useful fashion
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: konrad.schwarz at siemens dot com
  Target Milestone: ---

Consider the following code:

# define        ENCLOSING_OBJECT(TYPE, MEMBER, OBJECT)\
        (sizeof (&((TYPE *) 0)->MEMBER - OBJECT),\
        (TYPE *) ((char *) OBJECT - offsetof (TYPE, MEMBER)))

What this does is find the address of an "enclosing object" given the
address of one of its members MEMBER as OBJECT.
This can be useful when interacting with
programming frameworks -- often, MEMBER is actually the first element
of the application-defined object, but this macro is generic enough
that it doesn't have to be so.

As an additional compile-time type-safety check, the macro expansion 
includes an additional clause that ensures that OBJECT is indeed of the
type of MEMBER by subtracting its address from a synthesized enclosing
objects member's address;
this subtraction is done as the argument of sizeof(), ensuring
it doesn't actually get executed at run-time.

Newer versions of GCC flag this construct with an "unused value" warning,
which can be disabled globally with
# pragma GCC diagnostic ignored "-Wunused-value".

In general however, the unused value warning is useful, so one
would like to restrict the scope of ignoring the warning to as
small an area as possible.  The GCC diagnostic pragmas allow this
to be done with the `diagnostic push' and `diagnostic pop'
sub-commands.

In C90, one would have to add # pragma directives around each use
of the macro, clearly an undesirable approach.  Hence, in C0x,
_Pragma was introduced to allow pragma directives to
result as a by-product of macro expansion.

Thus, the C0x solution would be to extend the definition of the macro
with
    _Pragma ("GCC diagnostic push")\
    _Pragma ("GCC diagnostic ignored \"-Wunused-value\"")\
    -- original macro text --\
    _Pragma ("GCC diagnostic pop")

However, GCC fails to compile this, because it can't handle
pragmas in the middle of expressions.

This makes the GCC implementation of _Pragma worthless.

Reply via email to