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,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");