diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3bb29de5a567..584c9714d426 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 1999-04-30 Mark Mitchell + * typeck.c (build_const_cast): Tweak last change to handle + templates correctly. + * typeck.c (build_const_cast): Disallow use of const_cast to anything but a pointer or reference type. diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index c01131adec37..ad7f552b1cb4 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -5633,14 +5633,6 @@ 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); @@ -5651,6 +5643,14 @@ build_const_cast (type, expr) return t; } + 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 (type) != REFERENCE_TYPE) { expr = decay_conversion (expr); diff --git a/gcc/testsuite/g++.old-deja/g++.pt/cast1.C b/gcc/testsuite/g++.old-deja/g++.pt/cast1.C new file mode 100644 index 000000000000..e37b16931556 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/cast1.C @@ -0,0 +1,7 @@ +// Build don't link: +// Origin: Mark Mitchell + +template +void f (T t) { + const_cast(t); +}