diff options
author | Paolo Carlini <paolo@gcc.gnu.org> | 2013-07-10 16:45:25 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2013-07-10 16:45:25 +0000 |
commit | dfeadaa00be8251addff242849f6165ea9ee480c (patch) | |
tree | 75c055db7e0b64c63a205638547a013fa6c62169 | |
parent | 87e356bada28a71fd101dce4512564ff6cb8fb15 (diff) | |
download | gcc-dfeadaa00be8251addff242849f6165ea9ee480c.zip gcc-dfeadaa00be8251addff242849f6165ea9ee480c.tar.gz gcc-dfeadaa00be8251addff242849f6165ea9ee480c.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/c-family/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/c-family/c.opt | 4 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 12 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/conversion/dr195.C | 17 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/reinterpret_cast1.C | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/expr/cast2.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wconditionally-supported-1.C | 25 |
11 files changed, 83 insertions, 18 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e5a233f..354e15c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +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> PR target/57844 diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index ec47ffb..0506e55 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,8 @@ +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> PR c/57821 @@ -17,7 +22,7 @@ * c-cppbuiltin.c (c_cpp_builtins): 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 parameter type's from a dynamic array to a vec_tree. Also removed @@ -70,7 +75,7 @@ (find_inv_trees): Likewise. (replace_inv_trees): Likewise. (find_correct_array_notation_type): Likewise. - + 2013-05-28 Balaji V. Iyer <balaji.v.iyer@intel.com> * c-common.c (c_define_builtins): When cilkplus is enabled, the diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt index 85781347..9690a08 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -319,6 +319,10 @@ Wcomments C ObjC C++ ObjC++ Warning Alias(Wcomment) Synonym for -Wcomment +Wconditionally-supported +C++ ObjC++ Var(warn_conditionally_supported) Warning +Warn for conditionally-supported constructs + Wconversion C ObjC C++ ObjC++ Var(warn_conversion) Warning Warn for implicit type conversions that may change a value diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7da759a..3dede36 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +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> PR c++/57402 diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 6f7d489..1d504ad 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -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)) || (TYPE_PTRFN_P (intype) && TYPE_PTROBV_P (type))) { - if (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"); + if (complain & tf_warning) + /* C++11 5.2.10 p8 says that "Converting a function pointer to an + object pointer type or vice versa is conditionally-supported." */ + warning (OPT_Wconditionally_supported, + "casting between pointer-to-function and pointer-to-object " + "is conditionally-supported"); return fold_if_not_in_template (build_nop (type, expr)); } else if (TREE_CODE (type) == VECTOR_TYPE) diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 1496d30..dd34233 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -237,7 +237,7 @@ Objective-C and Objective-C++ Dialects}. -Waggressive-loop-optimizations -Warray-bounds @gol -Wno-attributes -Wno-builtin-macro-redefined @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 -Wno-deprecated-declarations -Wdisabled-optimization @gol -Wno-div-by-zero -Wdouble-promotion -Wempty-body -Wenum-compare @gol @@ -4393,6 +4393,11 @@ programs. Warn for variables that might be changed by @samp{longjmp} or @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 @opindex Wconversion @opindex Wno-conversion diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 82502f5..520818f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +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> PR preprocessor/57757 diff --git a/gcc/testsuite/g++.dg/conversion/dr195.C b/gcc/testsuite/g++.dg/conversion/dr195.C index 8502c15..cb26623 100644 --- a/gcc/testsuite/g++.dg/conversion/dr195.C +++ b/gcc/testsuite/g++.dg/conversion/dr195.C @@ -1,11 +1,12 @@ // Copyright (C) 2004 Free Software Foundation, Inc. // 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). +// 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 when being pedantic. +// This checks we don't warn anymore with -pedantic. 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); + pv = reinterpret_cast <PV>(pf); /* 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); + po = reinterpret_cast <PO>(pf); /* These will never be ok, as they are implicit. */ pv = pf; // { dg-error "invalid conversion" "" } diff --git a/gcc/testsuite/g++.dg/cpp0x/reinterpret_cast1.C b/gcc/testsuite/g++.dg/cpp0x/reinterpret_cast1.C new file mode 100644 index 0000000..7c0463e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/reinterpret_cast1.C @@ -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"); diff --git a/gcc/testsuite/g++.dg/expr/cast2.C b/gcc/testsuite/g++.dg/expr/cast2.C index 1ccda2b..f3c18d5 100644 --- a/gcc/testsuite/g++.dg/expr/cast2.C +++ b/gcc/testsuite/g++.dg/expr/cast2.C @@ -1,5 +1,5 @@ void (*p)(); void f() { - (void *)p; // { dg-warning "forbids cast" } + (void *)p; } diff --git a/gcc/testsuite/g++.dg/warn/Wconditionally-supported-1.C b/gcc/testsuite/g++.dg/warn/Wconditionally-supported-1.C new file mode 100644 index 0000000..8cc5966 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wconditionally-supported-1.C @@ -0,0 +1,25 @@ +// { 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" } +} |