OSDN Git Service

* include/cpplib.h (CPP_N_DFLOAT): New.
authorbje <bje@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 6 Dec 2005 23:13:15 +0000 (23:13 +0000)
committerbje <bje@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 6 Dec 2005 23:13:15 +0000 (23:13 +0000)
* expr.c (interpret_float_suffix): Identify df, dd, and dl
suffixes as decimal floating point constants.
(cpp_classify_number): Disallow hexadecimal DFP constants.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@108133 138bc75d-0d04-0410-961f-82ee72b054a4

libcpp/ChangeLog
libcpp/expr.c
libcpp/include/cpplib.h

index 312cb98..d96b55f 100644 (file)
@@ -1,3 +1,11 @@
+2005-12-07  Jon Grimm  <jgrimm2@us.ibm.com>
+           Ben Elliston  <bje@au.ibm.com>
+
+       * include/cpplib.h (CPP_N_DFLOAT): New.
+       * expr.c (interpret_float_suffix): Identify df, dd, and dl
+       suffixes as decimal floating point constants.
+       (cpp_classify_number): Disallow hexadecimal DFP constants.
+
 2005-11-14  Gerald Pfeifer  <gerald@pfeifer.com>
             Ian Lance Taylor  <ian@airs.com>
 
index 32b1723..a61ff66 100644 (file)
@@ -82,7 +82,7 @@ static void check_promotion (cpp_reader *, const struct op *);
 static unsigned int
 interpret_float_suffix (const uchar *s, size_t len)
 {
-  size_t f = 0, l = 0, i = 0;
+  size_t f = 0, l = 0, i = 0, d = 0;
 
   while (len--)
     switch (s[len])
@@ -91,6 +91,12 @@ interpret_float_suffix (const uchar *s, size_t len)
       case 'l': case 'L': l++; break;
       case 'i': case 'I':
       case 'j': case 'J': i++; break;
+      case 'd': case 'D': 
+       /* Disallow fd, ld suffixes.  */
+       if (d && (f || l))
+         return 0;
+       d++;
+       break;
       default:
        return 0;
       }
@@ -98,9 +104,14 @@ interpret_float_suffix (const uchar *s, size_t len)
   if (f + l > 1 || i > 1)
     return 0;
 
+  /* Allow dd, df, dl suffixes for decimal float constants.  */
+  if (d && ((d + f + l != 2) || i))
+    return 0;
+
   return ((i ? CPP_N_IMAGINARY : 0)
          | (f ? CPP_N_SMALL :
-            l ? CPP_N_LARGE : CPP_N_MEDIUM));
+            l ? CPP_N_LARGE : CPP_N_MEDIUM)
+         | (d ? CPP_N_DFLOAT : 0));
 }
 
 /* Subroutine of cpp_classify_number.  S points to an integer suffix
@@ -250,6 +261,15 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token)
                   "traditional C rejects the \"%.*s\" suffix",
                   (int) (limit - str), str);
 
+      /* Radix must be 10 for decimal floats.  */
+      if ((result & CPP_N_DFLOAT) && radix != 10)
+        {
+          cpp_error (pfile, CPP_DL_ERROR,
+                     "invalid suffix \"%.*s\" with hexadecimal floating constant",
+                     (int) (limit - str), str);
+          return CPP_N_INVALID;
+        }
+
       result |= CPP_N_FLOATING;
     }
   else
index 9ec022f..b5bece5 100644 (file)
@@ -743,6 +743,7 @@ struct cpp_num
 
 #define CPP_N_UNSIGNED 0x1000  /* Properties.  */
 #define CPP_N_IMAGINARY        0x2000
+#define CPP_N_DFLOAT   0x4000
 
 /* Classify a CPP_NUMBER token.  The return value is a combination of
    the flags from the above sets.  */