]> gcc.gnu.org Git - gcc.git/commitdiff
typeck.c (build_c_cast): Do template processing earlier.
authorNathan Sidwell <nathan@codesourcery.com>
Fri, 12 Jan 2001 09:47:23 +0000 (09:47 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Fri, 12 Jan 2001 09:47:23 +0000 (09:47 +0000)
cp:
* typeck.c (build_c_cast): Do template processing earlier.
Always pedwarn on array casts.
testsuite:
* g++.old-deja/g++.pt/cast2.C: New test.

From-SVN: r38941

gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.old-deja/g++.pt/cast2.C [new file with mode: 0644]

index 1297b2f51077a451ce8b86d6cb822c883096014b..fd6caefbe81013ff415829cd2f1a359b8a521308 100644 (file)
@@ -1,3 +1,8 @@
+2001-01-12  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * typeck.c (build_c_cast): Do template processing earlier.
+       Always pedwarn on array casts.
+
 2001-01-12  Nathan Sidwell  <nathan@codesourcery.com>
 
        * friend.c (make_friend_class): Make sure a templated class is
index a10f1d4cafab7de5e0162e36603fd6864749b3ec..6a05ef9dd657a2762c8cba7dbfd072616c80028c 100644 (file)
@@ -5349,6 +5349,13 @@ build_c_cast (type, expr)
   if (type == error_mark_node || expr == error_mark_node)
     return error_mark_node;
 
+  if (processing_template_decl)
+    {
+      tree t = build_min (CAST_EXPR, type,
+                         tree_cons (NULL_TREE, value, NULL_TREE));
+      return t;
+    }
+
   /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
      Strip such NOP_EXPRs if VALUE is being used in non-lvalue context.  */
   if (TREE_CODE (type) != REFERENCE_TYPE
@@ -5365,13 +5372,12 @@ build_c_cast (type, expr)
         NIHCL uses it. It is not valid ISO C++ however.  */
       if (TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE)
        {
-         if (pedantic)
-           pedwarn ("ISO C++ forbids casting to an array type");
+         cp_pedwarn ("ISO C++ forbids casting to an array type `%T'", type);
          type = build_pointer_type (TREE_TYPE (type));
        }
       else
        {
-         error ("ISO C++ forbids casting to an array type");
+         cp_error ("ISO C++ forbids casting to an array type `%T'", type);
          return error_mark_node;
        }
     }
@@ -5383,13 +5389,6 @@ build_c_cast (type, expr)
       return error_mark_node;
     }
 
-  if (processing_template_decl)
-    {
-      tree t = build_min (CAST_EXPR, type,
-                         tree_cons (NULL_TREE, value, NULL_TREE));
-      return t;
-    }
-
   if (TREE_CODE (type) == VOID_TYPE)
     {
       /* Conversion to void does not cause any of the normal function to
index 8c413ab4e0226d1d001ca9d3d5f60f569390feb5..31a45bf17b43d51317c877942b38d65a1009315b 100644 (file)
@@ -1,3 +1,7 @@
+2001-01-12  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * g++.old-deja/g++.pt/cast2.C: New test.
+
 2001-01-12  Nathan Sidwell  <nathan@codesourcery.com>
 
        * g++.old-deja/g++.pt/friend47.C: New test.
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/cast2.C b/gcc/testsuite/g++.old-deja/g++.pt/cast2.C
new file mode 100644 (file)
index 0000000..fb0a260
--- /dev/null
@@ -0,0 +1,32 @@
+// Build don't link:
+
+// Copyright (C) 2000 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 10 Jan 2001 <nathan@codesourcery.com>
+
+// Bug 1588. We ICE'd on reparsing an absdcl as a cast inside a template
+// function.
+
+class A {
+public:
+ template <class T> void f(void *CLUTp);
+};
+
+template <class T> void A::f(void *CLUTp)
+{
+    void *CLUT;
+
+    CLUT = (unsigned char [3][256])CLUTp; // ERROR - cast to array
+
+    return;
+}
+
+
+int main()
+{
+       A myobj;
+       unsigned char t[3][256];
+
+       myobj.f<unsigned char>(t);
+               
+       return 0;
+}
This page took 0.109559 seconds and 5 git commands to generate.