re PR preprocessor/41947 (GCC Hexadecimal Floating point constant handling)

libcpp:
	PR preprocessor/41947
	* expr.c (cpp_classify_number): Give error for hexadecimal
	floating-point constant with no digits before or after point.

gcc/testsuite:
	* gcc.dg/c99-hexfloat-3.c: New test.

From-SVN: r155558
This commit is contained in:
Joseph Myers 2010-01-01 18:08:17 +00:00 committed by Joseph Myers
parent e4a95933a6
commit dadab4fd22
4 changed files with 43 additions and 1 deletions

View file

@ -1,3 +1,8 @@
2010-01-01 Joseph Myers <joseph@codesourcery.com>
PR preprocessor/41947
* gcc.dg/c99-hexfloat-3.c: New test.
2010-01-01 Richard Guenther <rguenther@suse.de>
PR c/42570

View file

@ -0,0 +1,25 @@
/* Test syntax of hexadecimal floating point constants: at least one
digit needed before or after point. PR 41947. */
/* { dg-do compile } */
/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
double d0 = 0x0.0p0;
double d1 = 0x.0p0;
double d2 = 0x0.p0;
double d3 = 0x0.0p+0;
double d4 = 0x.0p+0;
double d5 = 0x0.p+0;
double d6 = 0x0.0p-0;
double d7 = 0x.0p-0;
double d8 = 0x0.p-0;
double e0 = 0x.p0; /* { dg-error "no digits" } */
double e1 = 0x0.; /* { dg-error "require an exponent" } */
double e2 = 0x.0; /* { dg-error "require an exponent" } */
double e3 = 0x0.0; /* { dg-error "require an exponent" } */
double e4 = 0x0.0p; /* { dg-error "exponent has no digits" } */
double e5 = 0x0.0pf; /* { dg-error "exponent has no digits" } */
double e6 = 0x0.0p+; /* { dg-error "exponent has no digits" } */
double e7 = 0x0.0p+f; /* { dg-error "exponent has no digits" } */
double e8 = 0x0.0p-; /* { dg-error "exponent has no digits" } */
double e9 = 0x0.0p-f; /* { dg-error "exponent has no digits" } */

View file

@ -1,3 +1,9 @@
2010-01-01 Joseph Myers <joseph@codesourcery.com>
PR preprocessor/41947
* expr.c (cpp_classify_number): Give error for hexadecimal
floating-point constant with no digits before or after point.
2009-11-20 Arnaud Charlet <charlet@adacore.com>
* macro.c (enter_macro_context): Call cb.used callback if defined.

View file

@ -1,6 +1,6 @@
/* Parse C expressions for cpplib.
Copyright (C) 1987, 1992, 1994, 1995, 1997, 1998, 1999, 2000, 2001,
2002, 2004, 2008, 2009 Free Software Foundation.
2002, 2004, 2008, 2009, 2010 Free Software Foundation.
Contributed by Per Bothner, 1994.
This program is free software; you can redistribute it and/or modify it
@ -229,6 +229,7 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token)
const uchar *limit;
unsigned int max_digit, result, radix;
enum {NOT_FLOAT = 0, AFTER_POINT, AFTER_EXPON} float_flag;
bool seen_digit;
/* If the lexer has done its job, length one can only be a single
digit. Fast-path this very common case. */
@ -239,6 +240,7 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token)
float_flag = NOT_FLOAT;
max_digit = 0;
radix = 10;
seen_digit = false;
/* First, interpret the radix. */
if (*str == '0')
@ -267,6 +269,7 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token)
if (ISDIGIT (c) || (ISXDIGIT (c) && radix == 16))
{
seen_digit = true;
c = hex_value (c);
if (c > max_digit)
max_digit = c;
@ -332,6 +335,9 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token)
return CPP_N_INVALID;
}
if (radix == 16 && !seen_digit)
SYNTAX_ERROR ("no digits in hexadecimal floating constant");
if (radix == 16 && CPP_PEDANTIC (pfile) && !CPP_OPTION (pfile, c99))
cpp_error (pfile, CPP_DL_PEDWARN,
"use of C99 hexadecimal floating constant");