This patch fixes the regression reported in PR53463 for arm-none-eabi as well.
Thanks, Greta > -----Original Message----- > From: Dodji Seketeli [mailto:do...@redhat.com] > Sent: 21 May 2012 14:55 > To: GCC Patches > Cc: Jason Merrill; Tom Tromey; Paolo Carlini > Subject: [PATCH 2/2] Better system header location detection for built- > in macro tokens > > Hello, > > 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 look at the location for the > expansion point of the built-in macro instead. > > Bootstrapped and tested on x86_64-unknown-linux-gnu against trunk. > > libcpp/ > > * line-map.c (linemap_location_in_system_header_p): Check > expansion point location for built-in macro tokens. > > gcc/testsuite/ > > * g++.dg/cpp/limits.C: New test. > --- > gcc/testsuite/g++.dg/cpp/limits.C | 21 +++++++++++++++++++++ > libcpp/line-map.c | 18 ++++++++++++++---- > 2 files changed, 35 insertions(+), 4 deletions(-) > create mode 100644 gcc/testsuite/g++.dg/cpp/limits.C > > diff --git a/gcc/testsuite/g++.dg/cpp/limits.C > b/gcc/testsuite/g++.dg/cpp/limits.C > new file mode 100644 > index 0000000..b64e1e2 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/cpp/limits.C > @@ -0,0 +1,21 @@ > +// { dg-options "-pedantic" } > +// { dg-do compile } > + > +#include <limits> > + > +// Compiling this with -pedantic was wrongly triggering this error: > +// libstdc++-v3/include/limits:1269:45: warning : use of C++0x long > long integer constant [-Wlong-long] > +// min() _GLIBCXX_USE_NOEXCEPT { return -__LONG_LONG_MAX__ - 1; > } > +// ^ > +// libstdc++-v3/include/limits:1272:44: warning : use of C++0x long > long integer constant [-Wlong-long] > +// max() _GLIBCXX_USE_NOEXCEPT { return __LONG_LONG_MAX__; } > +// ^ > +// libstdc++-v3/include/limits:1342:44: warning : use of C++0x long > long integer constant [-Wlong-long] > +// max() _GLIBCXX_USE_NOEXCEPT { return __LONG_LONG_MAX__ * 2ULL > + 1 > +// ^ > + > +int > +main () > +{ > + return 0; > +} > diff --git a/libcpp/line-map.c b/libcpp/line-map.c > index 6e514e5..5a2ca0f 100644 > --- a/libcpp/line-map.c > +++ b/libcpp/line-map.c > @@ -754,12 +754,22 @@ linemap_location_in_system_header_p (struct > line_maps *set, > source_location location) > { > const struct line_map *map = NULL; > - > - location = > + source_location loc = > linemap_resolve_location (set, location, LRK_SPELLING_LOCATION, > &map); > > - if (location < RESERVED_LOCATION_COUNT) > - return false; > + if (loc < RESERVED_LOCATION_COUNT) > + { > + /* Maybe LOCATION is for a token that comes from the expansion > + of a built-in macro. In that case, we cannot know from its > + spelling location (which is thus a reserved location) where > + exactly the token is located. So let's see where that > + built-in macro has been expanded, instead. */ > + loc = linemap_resolve_location (set, location, > + LRK_MACRO_EXPANSION_POINT, > + &map); > + if (loc < RESERVED_LOCATION_COUNT) > + return false; > + } > > return LINEMAP_SYSP (map); > } > -- > Dodji