Commit dfeadaa0 by Paolo Carlini

re PR c++/57869 ([C++11] Casting a object pointer to a function pointer should…

re PR c++/57869 ([C++11] Casting a object pointer to a function pointer should not warn about a forbidden conversion)

/c-family
2013-07-10  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/57869
	* c.opt: Add Wconditionally-supported.

/cp
2013-07-10  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/57869
	* typeck.c (build_reinterpret_cast_1): With -Wconditionally-supported
	warn about casting between pointer-to-function and pointer-to-object.

/gcc
2013-07-10  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/57869
	* doc/invoke.texi: Document -Wconditionally-supported.

/testsuite
2013-07-10  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/57869
	* g++.dg/cpp0x/reinterpret_cast1.C: New.
	* g++.dg/warn/Wconditionally-supported-1.C: Likewise.
	* g++.dg/conversion/dr195.C: Update.
	* g++.dg/expr/cast2.C: Likewise.

From-SVN: r200876
parent 87e356ba
2013-07-10 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/57869
* doc/invoke.texi: Document -Wconditionally-supported.
2013-07-10 Georg-Johann Lay <avr@gjlay.de> 2013-07-10 Georg-Johann Lay <avr@gjlay.de>
PR target/57844 PR target/57844
......
2013-07-10 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/57869
* c.opt: Add Wconditionally-supported.
2013-07-04 Joern Rennecke <joern.rennecke@embecosm.com> 2013-07-04 Joern Rennecke <joern.rennecke@embecosm.com>
PR c/57821 PR c/57821
...@@ -17,7 +22,7 @@ ...@@ -17,7 +22,7 @@
* c-cppbuiltin.c (c_cpp_builtins): Likewise. * c-cppbuiltin.c (c_cpp_builtins): Likewise.
* c-opts.c (c_common_post_options): Likewise. * c-opts.c (c_common_post_options): Likewise.
2013-06-21 Balaji V. Iyer <balaji.v.iyer@intel.com> 2013-06-21 Balaji V. Iyer <balaji.v.iyer@intel.com>
* array-notation-common.c (length_mismatch_in_expr): Changed the * array-notation-common.c (length_mismatch_in_expr): Changed the
parameter type's from a dynamic array to a vec_tree. Also removed parameter type's from a dynamic array to a vec_tree. Also removed
...@@ -70,7 +75,7 @@ ...@@ -70,7 +75,7 @@
(find_inv_trees): Likewise. (find_inv_trees): Likewise.
(replace_inv_trees): Likewise. (replace_inv_trees): Likewise.
(find_correct_array_notation_type): Likewise. (find_correct_array_notation_type): Likewise.
2013-05-28 Balaji V. Iyer <balaji.v.iyer@intel.com> 2013-05-28 Balaji V. Iyer <balaji.v.iyer@intel.com>
* c-common.c (c_define_builtins): When cilkplus is enabled, the * c-common.c (c_define_builtins): When cilkplus is enabled, the
......
...@@ -319,6 +319,10 @@ Wcomments ...@@ -319,6 +319,10 @@ Wcomments
C ObjC C++ ObjC++ Warning Alias(Wcomment) C ObjC C++ ObjC++ Warning Alias(Wcomment)
Synonym for -Wcomment Synonym for -Wcomment
Wconditionally-supported
C++ ObjC++ Var(warn_conditionally_supported) Warning
Warn for conditionally-supported constructs
Wconversion Wconversion
C ObjC C++ ObjC++ Var(warn_conversion) Warning C ObjC C++ ObjC++ Var(warn_conversion) Warning
Warn for implicit type conversions that may change a value Warn for implicit type conversions that may change a value
......
2013-07-10 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/57869
* typeck.c (build_reinterpret_cast_1): With -Wconditionally-supported
warn about casting between pointer-to-function and pointer-to-object.
2013-07-09 Jason Merrill <jason@redhat.com> 2013-07-09 Jason Merrill <jason@redhat.com>
PR c++/57402 PR c++/57402
......
...@@ -6722,12 +6722,12 @@ build_reinterpret_cast_1 (tree type, tree expr, bool c_cast_p, ...@@ -6722,12 +6722,12 @@ build_reinterpret_cast_1 (tree type, tree expr, bool c_cast_p,
else if ((TYPE_PTRFN_P (type) && TYPE_PTROBV_P (intype)) else if ((TYPE_PTRFN_P (type) && TYPE_PTROBV_P (intype))
|| (TYPE_PTRFN_P (intype) && TYPE_PTROBV_P (type))) || (TYPE_PTRFN_P (intype) && TYPE_PTROBV_P (type)))
{ {
if (pedantic && (complain & tf_warning)) if (complain & tf_warning)
/* Only issue a warning, as we have always supported this /* C++11 5.2.10 p8 says that "Converting a function pointer to an
where possible, and it is necessary in some cases. DR 195 object pointer type or vice versa is conditionally-supported." */
addresses this issue, but as of 2004/10/26 is still in warning (OPT_Wconditionally_supported,
drafting. */ "casting between pointer-to-function and pointer-to-object "
warning (0, "ISO C++ forbids casting between pointer-to-function and pointer-to-object"); "is conditionally-supported");
return fold_if_not_in_template (build_nop (type, expr)); return fold_if_not_in_template (build_nop (type, expr));
} }
else if (TREE_CODE (type) == VECTOR_TYPE) else if (TREE_CODE (type) == VECTOR_TYPE)
......
...@@ -237,7 +237,7 @@ Objective-C and Objective-C++ Dialects}. ...@@ -237,7 +237,7 @@ Objective-C and Objective-C++ Dialects}.
-Waggressive-loop-optimizations -Warray-bounds @gol -Waggressive-loop-optimizations -Warray-bounds @gol
-Wno-attributes -Wno-builtin-macro-redefined @gol -Wno-attributes -Wno-builtin-macro-redefined @gol
-Wc++-compat -Wc++11-compat -Wcast-align -Wcast-qual @gol -Wc++-compat -Wc++11-compat -Wcast-align -Wcast-qual @gol
-Wchar-subscripts -Wclobbered -Wcomment @gol -Wchar-subscripts -Wclobbered -Wcomment -Wconditionally-supported @gol
-Wconversion -Wcoverage-mismatch -Wno-cpp -Wno-deprecated @gol -Wconversion -Wcoverage-mismatch -Wno-cpp -Wno-deprecated @gol
-Wno-deprecated-declarations -Wdisabled-optimization @gol -Wno-deprecated-declarations -Wdisabled-optimization @gol
-Wno-div-by-zero -Wdouble-promotion -Wempty-body -Wenum-compare @gol -Wno-div-by-zero -Wdouble-promotion -Wempty-body -Wenum-compare @gol
...@@ -4393,6 +4393,11 @@ programs. ...@@ -4393,6 +4393,11 @@ programs.
Warn for variables that might be changed by @samp{longjmp} or Warn for variables that might be changed by @samp{longjmp} or
@samp{vfork}. This warning is also enabled by @option{-Wextra}. @samp{vfork}. This warning is also enabled by @option{-Wextra}.
@item -Wconditionally-supported @r{(C++ and Objective-C++ only)}
@opindex Wconditionally-supported
@opindex Wno-conditionally-supported
Warn for conditionally-supported (C++11 [intro.defs]) constructs.
@item -Wconversion @item -Wconversion
@opindex Wconversion @opindex Wconversion
@opindex Wno-conversion @opindex Wno-conversion
......
2013-07-10 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/57869
* g++.dg/cpp0x/reinterpret_cast1.C: New.
* g++.dg/warn/Wconditionally-supported-1.C: Likewise.
* g++.dg/conversion/dr195.C: Update.
* g++.dg/expr/cast2.C: Likewise.
2013-07-10 Jakub Jelinek <jakub@redhat.com> 2013-07-10 Jakub Jelinek <jakub@redhat.com>
PR preprocessor/57757 PR preprocessor/57757
......
// Copyright (C) 2004 Free Software Foundation, Inc. // Copyright (C) 2004 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 20 Oct 2004 <nathan@codesourcery.com> // Contributed by Nathan Sidwell 20 Oct 2004 <nathan@codesourcery.com>
// DR 195 will allow conversions between function and object pointers // DR 195 was about allowing conversions between function and object
// under some circumstances. It is in drafting, so we don't implement // pointers under some circumstances. The issue got resolved for C++11,
// it (yet). // 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 don't warn anymore with -pedantic.
typedef void (*PF)(void); typedef void (*PF)(void);
typedef void *PV; typedef void *PV;
...@@ -18,12 +19,12 @@ void foo () ...@@ -18,12 +19,12 @@ void foo ()
PO po; PO po;
/* the following two will almost definitly be ok with 195. */ /* the following two will almost definitly be ok with 195. */
pf = reinterpret_cast <PF>(pv); // { dg-warning "casting between" "" } pf = reinterpret_cast <PF>(pv);
pv = reinterpret_cast <PV>(pf); // { dg-warning "casting between" "" } pv = reinterpret_cast <PV>(pf);
/* the following two might or might not be ok with 195. */ /* the following two might or might not be ok with 195. */
pf = reinterpret_cast <PF>(po); // { dg-warning "casting between" "" } pf = reinterpret_cast <PF>(po);
po = reinterpret_cast <PO>(pf); // { dg-warning "casting between" "" } po = reinterpret_cast <PO>(pf);
/* These will never be ok, as they are implicit. */ /* These will never be ok, as they are implicit. */
pv = pf; // { dg-error "invalid conversion" "" } pv = pf; // { dg-error "invalid conversion" "" }
......
// 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");
void (*p)(); void (*p)();
void f() { void f() {
(void *)p; // { dg-warning "forbids cast" } (void *)p;
} }
// { dg-options "-Wconditionally-supported" }
// DR 195 was about allowing conversions between function and object
// pointers 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 with -Wconditionally-supported.
typedef void (*PF)(void);
typedef void *PV;
typedef int *PO;
void foo ()
{
PF pf;
PV pv;
PO po;
pf = reinterpret_cast <PF>(pv); // { dg-warning "conditionally-supported" }
pv = reinterpret_cast <PV>(pf); // { dg-warning "conditionally-supported" }
pf = reinterpret_cast <PF>(po); // { dg-warning "conditionally-supported" }
po = reinterpret_cast <PO>(pf); // { dg-warning "conditionally-supported" }
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment