From: Nathan Sidwell Date: Fri, 29 Oct 2004 08:35:49 +0000 (+0000) Subject: typeck.c (composite_pointer_type): Remove comment about DR 195. X-Git-Tag: releases/gcc-4.0.0~3579 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ec7e5618bc8b9d720803a3857eb787983b089318;p=thirdparty%2Fgcc.git typeck.c (composite_pointer_type): Remove comment about DR 195. cp: * typeck.c (composite_pointer_type): Remove comment about DR 195. (build_reinterpret_cast_1): Revert DR195 patch. Only emit a warning when being pedantic. (build_reinterpet_cast, build_c_cast): Adjust. testsuite: * g++.dg/conversion/dr195.C: Adjust expected errors for DR195 not being implemented. * g++.dg/conversion/dr195-1.C: New. * g++.old-deja/g++.brendan/operators4.C: Don't be pedantic. * g++.old-deja/g++.mike/p10148.C: Likewise. From-SVN: r89826 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5fca4cbea404..1af9e25993f1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2004-10-28 Nathan Sidwell + + * typeck.c (composite_pointer_type): Remove comment about DR 195. + (build_reinterpret_cast_1): Revert DR195 patch. Only emit a + warning when being pedantic. + (build_reinterpet_cast, build_c_cast): Adjust. + 2004-10-29 Mark Mitchell PR c++/17695 diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 5e7bf90b5522..6593a65beaad 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -507,8 +507,6 @@ composite_pointer_type (tree t1, tree t2, tree arg1, tree arg2, tree result_type; if (pedantic && TYPE_PTRFN_P (t2)) - /* Although DR195 suggests allowing this when no precision is - lost, that is only allowed in a reinterpret_cast. */ pedwarn ("ISO C++ forbids %s between pointer of type % " "and pointer-to-function", location); result_type @@ -4827,7 +4825,7 @@ convert_member_func_to_ptr (tree type, tree expr) static tree build_reinterpret_cast_1 (tree type, tree expr, bool c_cast_p, - bool for_reinterpret_ref_p, bool *valid_p) + bool *valid_p) { tree intype; @@ -4867,7 +4865,7 @@ build_reinterpret_cast_1 (tree type, tree expr, bool c_cast_p, expr = build_unary_op (ADDR_EXPR, expr, 0); if (expr != error_mark_node) expr = build_reinterpret_cast_1 - (build_pointer_type (TREE_TYPE (type)), expr, c_cast_p, true, + (build_pointer_type (TREE_TYPE (type)), expr, c_cast_p, valid_p); if (expr != error_mark_node) expr = build_indirect_ref (expr, 0); @@ -4945,24 +4943,12 @@ build_reinterpret_cast_1 (tree type, tree expr, bool c_cast_p, else if ((TYPE_PTRFN_P (type) && TYPE_PTROBV_P (intype)) || (TYPE_PTRFN_P (intype) && TYPE_PTROBV_P (type))) { - if (pedantic || !c_cast_p) - { - /* DR 195 suggests allowing such casts if they do not lose - precision. We allow conversion to pointer-to-void, if it - does not lose precision, and we allow conversion from - pointer-to-void regardless, so that one may convert - back again without warning. Such conversions are not - permitted when we are recursively called to deal with - reinterpreting reference casts. */ - if (!for_reinterpret_ref_p && VOID_TYPE_P (TREE_TYPE (type))) - { - if (TYPE_PRECISION (type) < TYPE_PRECISION (intype)) - warning ("conversion from %qT to %qT loses precision", - intype, type); - } - else if (for_reinterpret_ref_p || !VOID_TYPE_P (TREE_TYPE (intype))) - pedwarn ("ISO C++ forbids casting between pointer-to-function and pointer-to-object"); - } + if (pedantic) + /* Only issue a warning, as we have always supported this + where possible, and it is necessary in some cases. DR 195 + addresses this issue, but as of 2004/10/26 is still in + drafting. */ + warning ("ISO C++ forbids casting between pointer-to-function and pointer-to-object"); expr = decl_constant_value (expr); return fold_if_not_in_template (build_nop (type, expr)); @@ -4998,7 +4984,6 @@ build_reinterpret_cast (tree type, tree expr) } return build_reinterpret_cast_1 (type, expr, /*c_cast_p=*/false, - /*for_reinterpret_ref=*/false, /*valid_p=*/NULL); } @@ -5201,7 +5186,6 @@ build_c_cast (tree type, tree expr) /* Or a reinterpret_cast. */ if (!valid_p) result = build_reinterpret_cast_1 (type, value, /*c_cast_p=*/true, - /*for_reinterpret_ref_p=*/false, &valid_p); /* The static_cast or reinterpret_cast may be followed by a const_cast. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 089fc6428d5c..f6f3bded2750 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2004-10-28 Nathan Sidwell + + * g++.dg/conversion/dr195.C: Adjust expected errors for DR195 not + being implemented. + * g++.dg/conversion/dr195-1.C: New. + * g++.old-deja/g++.brendan/operators4.C: Don't be pedantic. + * g++.old-deja/g++.mike/p10148.C: Likewise. + 2004-10-29 Mark Mitchell PR c++/17695 diff --git a/gcc/testsuite/g++.dg/conversion/dr195-1.C b/gcc/testsuite/g++.dg/conversion/dr195-1.C new file mode 100644 index 000000000000..ca38580e5fe5 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/dr195-1.C @@ -0,0 +1,34 @@ +// { dg-options "" } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 20 Oct 2004 + +// DR 195 will allow conversions between function and object pointers +// under some circumstances. It is in drafting, so we don't implement +// it (yet). + +// this checks we are silent when not being pedantic. + +typedef void (*PF)(void); +typedef void *PV; +typedef int *PO; + + +void foo () +{ + PF pf; + PV pv; + PO po; + + /* the following two will almost definitly be ok with 195. */ + pf = reinterpret_cast (pv); + pv = reinterpret_cast (pf); + + /* the following two might or might not be ok with 195. */ + pf = reinterpret_cast (po); + po = reinterpret_cast (pf); + + /* These will never be ok, as they are implicit. */ + pv = pf; // { dg-error "invalid conversion" "" } + pf = pv; // { dg-error "invalid conversion" "" } +} diff --git a/gcc/testsuite/g++.dg/conversion/dr195.C b/gcc/testsuite/g++.dg/conversion/dr195.C index e6cf18e4ae4b..902b871d21f5 100644 --- a/gcc/testsuite/g++.dg/conversion/dr195.C +++ b/gcc/testsuite/g++.dg/conversion/dr195.C @@ -1,25 +1,31 @@ // Copyright (C) 2004 Free Software Foundation, Inc. // Contributed by Nathan Sidwell 20 Oct 2004 -// DR 195 allows conversions between function and object pointers -// under some circumstances. +// DR 195 will allow conversions between function and object pointers +// under some circumstances. It is in drafting, so we don't implement +// it (yet). + +// This checks we warn when being pedantic. typedef void (*PF)(void); typedef void *PV; typedef int *PO; - void foo () { PF pf; PV pv; PO po; - pf = reinterpret_cast (pv); - pv = reinterpret_cast (pf); + /* the following two will almost definitly be ok with 195. */ + pf = reinterpret_cast (pv); // { dg-warning "casting between" "" } + pv = reinterpret_cast (pf); // { dg-warning "casting between" "" } + + /* the following two might or might not be ok with 195. */ pf = reinterpret_cast (po); // { dg-error "casting between" "" } po = reinterpret_cast (pf); // { dg-error "casting between" "" } + /* These will never be ok, as they are implicit. */ pv = pf; // { dg-error "invalid conversion" "" } pf = pv; // { dg-error "invalid conversion" "" } } diff --git a/gcc/testsuite/g++.old-deja/g++.brendan/operators4.C b/gcc/testsuite/g++.old-deja/g++.brendan/operators4.C index 1f033a6bb79d..d5613f15847d 100644 --- a/gcc/testsuite/g++.old-deja/g++.brendan/operators4.C +++ b/gcc/testsuite/g++.old-deja/g++.brendan/operators4.C @@ -1,4 +1,6 @@ // { dg-do assemble } +// { dg-options "" } + // GROUPS passed operators // Check that the & operator, when applied to a global function // or member function returns a proper value as long as the context diff --git a/gcc/testsuite/g++.old-deja/g++.mike/p10148.C b/gcc/testsuite/g++.old-deja/g++.mike/p10148.C index 6661e6bf91ec..2cb359c9b9a8 100644 --- a/gcc/testsuite/g++.old-deja/g++.mike/p10148.C +++ b/gcc/testsuite/g++.old-deja/g++.mike/p10148.C @@ -1,4 +1,5 @@ // { dg-do run } +// { dg-options "" } // prms-id: 10148 int fail = 1;