typeck.c (build_const_cast): Disallow use of const_cast to anything but a pointer...
authorMark Mitchell <mark@codesourcery.com>
Fri, 30 Apr 1999 12:17:10 +0000 (12:17 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Fri, 30 Apr 1999 12:17:10 +0000 (12:17 +0000)
* typeck.c (build_const_cast): Disallow use of const_cast to
anything but a pointer or reference type.

From-SVN: r26708

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

index a6dec3a..3bb29de 100644 (file)
@@ -1,3 +1,8 @@
+1999-04-30  Mark Mitchell  <mark@codesourcery.com>
+
+       * typeck.c (build_const_cast): Disallow use of const_cast to
+       anything but a pointer or reference type.
+
 1999-04-30  Nathan Sidwell  <nathan@acm.org>
 
        * decl.c (cp_finish_decl): Don't permit arrays of abstract or
index 0053f1d..c01131a 100644 (file)
@@ -5633,6 +5633,14 @@ build_const_cast (type, expr)
   if (type == error_mark_node || expr == error_mark_node)
     return error_mark_node;
 
+  if (!POINTER_TYPE_P (type) && !TYPE_PTRMEMFUNC_P (type))
+    {
+      cp_error ("`%T' is not a pointer, reference, or pointer-to-member type",
+               type);
+      cp_error ("as required by const_cast");
+      return error_mark_node;
+    }
+
   if (TREE_CODE (expr) == OFFSET_REF)
     expr = resolve_offset_ref (expr);
 
diff --git a/gcc/testsuite/g++.old-deja/g++.other/cast2.C b/gcc/testsuite/g++.old-deja/g++.other/cast2.C
new file mode 100644 (file)
index 0000000..cd49640
--- /dev/null
@@ -0,0 +1,11 @@
+// Build don't link:
+// Origin: Mark Mitchell <mark@codesourcery.com>
+
+struct A {
+};
+
+int main()
+{
+  A a;
+  const_cast<const A>(a); // ERROR - const_cast requires pointer/ref types
+}