http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53463

--- Comment #6 from Dodji Seketeli <dodji at gcc dot gnu.org> 2012-06-04 
19:20:16 UTC ---
Author: dodji
Date: Mon Jun  4 19:19:58 2012
New Revision: 188203

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=188203
Log:
PR preprocessor/53463 - Fix system header detection for built-in macro tokens

The location for a built-in macro token is BUILTIN_LOCATION.  When we
see that location value, we cannot know if that token was used in a
system header or not.  And that can trigger some unwanted warnings on
e.g, the use of __LONG_LONG_MAX__ built-in macro in system headers
when we compile with -pedantic, like in the test case accompanying
this patch.

In that case, I think we ought to step-up to see where the built-in
macro has been expanded, until we see a location that is not for a
built-in macro.  Then we can check if the resulting location is in a
system header or not.

Now that we step up to the location of first non-built-in-macro token,
it appeared that for
testsuite/c-c++-common/dfp/convert-int-saturate.c, G++ then fails to
emit the warning in:

    volatile unsigned int usi;
    int
    main ()
    {
      usi = DEC32_MAX;  /* { dg-warning "overflow in implicit constant
conversion" } */
     ...
    }

Because DEC32_MAX is defined in the system header float.h as a
built-in macro:

    #define DEC32_MAX    __DEC32_MAX__

And during the parsing of the assignment expression that should have
led to the warning above, input_location is set to the location for
the DEC32_MAX, which is actually the location for the built-in
__DECL32_MAX_EXP.

A possible fix is to use the location of the "=" operator as the
default location for assignment expressions.  This is what the patch
does.

I had to adjust a couple of tests to arrange for this.

Bootstrapped and tested on x86_64-unknown-linux-gnu against trunk.

libcpp/

    PR preprocessor/53463
    * line-map.c (linemap_location_in_system_header_p): For built-in
    macro tokens, check the first expansion point location for that is
    not for a token coming from a built-in macro.

gcc/cp/

    PR preprocessor/53463
    * parser.c (cp_parser_assignment_expression): Use the location
    for the LHS as the default location for the expression.

gcc/testsuite/

    PR preprocessor/53463
    * g++.dg/cpp/limits.C: New test.
    * g++.dg/parse/error19.C: Adjust.
    * g++.dg/warn/Wconversion-real-integer2.C: Likewise.
    * g++.dg/warn/pr35635.C: Likewise.
    * g++.old-deja/g++.pt/assign1.C: Likewise.

Added:
    trunk/gcc/testsuite/g++.dg/cpp/limits.C
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/cp/parser.c
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/testsuite/g++.dg/parse/error19.C
    trunk/gcc/testsuite/g++.dg/warn/Wconversion-real-integer2.C
    trunk/gcc/testsuite/g++.dg/warn/pr35635.C
    trunk/gcc/testsuite/g++.old-deja/g++.pt/assign1.C
    trunk/libcpp/ChangeLog
    trunk/libcpp/line-map.c

Reply via email to