===================================================================
@@ -6722,12 +6722,15 @@ build_reinterpret_cast_1 (tree type, tree expr, bo
else if ((TYPE_PTRFN_P (type) && TYPE_PTROBV_P (intype))
|| (TYPE_PTRFN_P (intype) && TYPE_PTROBV_P (type)))
{
- if (pedantic && (complain & tf_warning))
+ if (cxx_dialect == cxx98
+ && pedantic && (complain & tf_warning))
/* 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 (0, "ISO C++ forbids casting between pointer-to-function and pointer-to-object");
+ addressed this issue, and C++11 5.2.10 p8 now says that
+ "Converting a function pointer to an object pointer type
+ or vice versa is conditionally-supported." */
+ warning (0, "ISO C++ 1998 forbids casting between pointer-to-function "
+ "and pointer-to-object");
return fold_if_not_in_template (build_nop (type, expr));
}
else if (TREE_CODE (type) == VECTOR_TYPE)
===================================================================
@@ -2,10 +2,11 @@
// Contributed by Nathan Sidwell 20 Oct 2004 <nathan@codesourcery.com>
// DR 195 will allow conversions between function and object pointers
-// under some circumstances. It is in drafting, so we don't implement
-// it (yet).
+// under some circumstances. The issue got resolved for C++11, which,
+// in 5.2.10 p8 says that: "Converting a function pointer to an object
+// pointer type or vice versa is conditionally-supported." */
-// This checks we warn when being pedantic.
+// This checks we warn when being pedantic in c++98 mode.
typedef void (*PF)(void);
typedef void *PV;
@@ -18,12 +19,12 @@ void foo ()
PO po;
/* the following two will almost definitly be ok with 195. */
- pf = reinterpret_cast <PF>(pv); // { dg-warning "casting between" "" }
- pv = reinterpret_cast <PV>(pf); // { dg-warning "casting between" "" }
+ pf = reinterpret_cast <PF>(pv); // { dg-warning "casting between" "" { target c++98 } }
+ pv = reinterpret_cast <PV>(pf); // { dg-warning "casting between" "" { target c++98 } }
/* the following two might or might not be ok with 195. */
- pf = reinterpret_cast <PF>(po); // { dg-warning "casting between" "" }
- po = reinterpret_cast <PO>(pf); // { dg-warning "casting between" "" }
+ pf = reinterpret_cast <PF>(po); // { dg-warning "casting between" "" { target c++98 } }
+ po = reinterpret_cast <PO>(pf); // { dg-warning "casting between" "" { target c++98 } }
/* These will never be ok, as they are implicit. */
pv = pf; // { dg-error "invalid conversion" "" }
===================================================================
@@ -0,0 +1,6 @@
+// PR c++/57869
+// { dg-do compile { target c++11 } }
+
+void* po = 0;
+void (*pf)() = reinterpret_cast<decltype(pf)>(po);
+static_assert(sizeof(po) >= sizeof(pf), "Conversion not supported");
===================================================================
@@ -1,5 +1,5 @@
void (*p)();
void f() {
- (void *)p; // { dg-warning "forbids cast" }
+ (void *)p; // { dg-warning "forbids cast" "" { target c++98 } }
}