re PR c++/6634 (wrong parsing of "long long double")
authorVolker Reichelt <reichelt@igpm.rwth-aachen.de>
Wed, 15 Mar 2006 15:27:11 +0000 (15:27 +0000)
committerVolker Reichelt <reichelt@gcc.gnu.org>
Wed, 15 Mar 2006 15:27:11 +0000 (15:27 +0000)
PR c++/6634
decl.c (grokdeclarator): Do not accept long long double.
Reorganize checks for invalid (combinations of) type modifiers.
Quote modifiers in messages.

g++.dg/parse/long1.C: New test.

From-SVN: r112084

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/long1.C [new file with mode: 0644]

index 77c03091754d63085630751477b6c219ee62d250..b3f411146eb41839a0b7ab127216ff889f819549 100644 (file)
@@ -1,3 +1,10 @@
+2006-03-15  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
+
+       PR c++/6634
+       decl.c (grokdeclarator): Do not accept long long double.
+       Reorganize checks for invalid (combinations of) type modifiers.
+       Quote modifiers in messages.
+
 2006-03-09  Jason Merrill  <jason@redhat.com>
 
        PR c++/16387, c++/16389
index d0866dc5b3dd3f0f7a122f89546c544b1a486352..bb6a59c4c55ac86bd50f378dd9256aba36b232a3 100644 (file)
@@ -7085,7 +7085,7 @@ grokdeclarator (const cp_declarator *declarator,
      and check for invalid combinations.  */
 
   /* Long double is a special combination.  */
-  if (long_p && TYPE_MAIN_VARIANT (type) == double_type_node)
+  if (long_p && !longlong && TYPE_MAIN_VARIANT (type) == double_type_node)
     {
       long_p = false;
       type = build_qualified_type (long_double_type_node,
@@ -7098,18 +7098,20 @@ grokdeclarator (const cp_declarator *declarator,
     {
       int ok = 0;
 
-      if (TREE_CODE (type) == REAL_TYPE)
-       error ("short, signed or unsigned invalid for %qs", name);
-      else if (TREE_CODE (type) != INTEGER_TYPE)
-       error ("long, short, signed or unsigned invalid for %qs", name);
-      else if (long_p && short_p)
-       error ("long and short specified together for %qs", name);
-      else if ((long_p || short_p) && explicit_char)
-       error ("long or short specified with char for %qs", name);
-      else if ((long_p|| short_p) && TREE_CODE (type) == REAL_TYPE)
-       error ("long or short specified with floating type for %qs", name);
+      if ((signed_p || unsigned_p) && TREE_CODE (type) != INTEGER_TYPE)
+       error ("%<signed%> or %<unsigned%> invalid for %qs", name);
       else if (signed_p && unsigned_p)
-       error ("signed and unsigned given together for %qs", name);
+       error ("%<signed%> and %<unsigned%> specified together for %qs", name);
+      else if (longlong && TREE_CODE (type) != INTEGER_TYPE)
+       error ("%<long long%> invalid for %qs", name);
+      else if (long_p && TREE_CODE (type) == REAL_TYPE)
+       error ("%<long%> invalid for %qs", name);
+      else if (short_p && TREE_CODE (type) == REAL_TYPE)
+       error ("%<short%> invalid for %qs", name);
+      else if ((long_p || short_p) && explicit_char)
+       error ("%<long%> or %<short%> specified with char for %qs", name);
+      else if (long_p && short_p)
+       error ("%<long%> and %<short%> specified together for %qs", name);
       else
        {
          ok = 1;
index ec0cd751b9ece4ce7474848ae55604e98e633c22..26255b308168777922afa3c72acee77209a5a8de 100644 (file)
@@ -1,3 +1,8 @@
+2006-03-15  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
+
+       PR c++/6634
+       g++.dg/parse/long1.C: New test.
+
 2006-03-14  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR fortran/19101
diff --git a/gcc/testsuite/g++.dg/parse/long1.C b/gcc/testsuite/g++.dg/parse/long1.C
new file mode 100644 (file)
index 0000000..628c86c
--- /dev/null
@@ -0,0 +1,7 @@
+// PR c++/6634
+// { dg-do compile }
+// { dg-options "" }
+
+long long double x; // { dg-error "long long" }
+long double y;
+long float z;       // { dg-error "long" }