https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70529
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jakub at gcc dot gnu.org --- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> --- So what do you suggest? The thing is, 0x123p2 in C++11/C++14 is a single preprocessing token, but 0x123p-2 or 0x123p+2 are 3 preprocessing tokens: pp-number: digit . digit pp-number digit pp-number identifier-nondigit pp-number e sign pp-number E sign . and identifier-nondigit is also a..z A..Z _ among others. Only in C++17 0x123p-2 is a single preprocessing token, as pp-number p sign pp-number P sign is added. If you use -pedantic, then you'll get a warning (or with -pedantic-errors error) for all uses of hexadecimal floats. So, either use the GNU extension modes (-std=gnu++11, -std=gnu++14), or wait for -std=c++17.