diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2013-04-11 12:46:10 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2013-04-11 12:46:10 +0000 |
commit | 7c55f4101789d76d1a9bab69631edb171321f12f (patch) | |
tree | f2b42078949cacebf29ff22cb452a4cfa62de440 /gcc | |
parent | 4d8f3296a0d32cf3c8b3956c8c0c778703b494c0 (diff) | |
download | gcc-7c55f4101789d76d1a9bab69631edb171321f12f.zip gcc-7c55f4101789d76d1a9bab69631edb171321f12f.tar.gz gcc-7c55f4101789d76d1a9bab69631edb171321f12f.tar.bz2 |
re PR c++/56913 ([C++11] SFINAE for ill-formed pointer-to-member operators with incompatible ref-qualifiers)
/cp
2013-04-11 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/56913
* typeck2.c (build_m_component_ref): Protect error calls with
(complain & tf_error).
/testsuite
2013-04-11 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/56913
* g++.dg/cpp0x/sfinae44.C: New.
From-SVN: r197780
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/typeck2.c | 16 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/sfinae44.C | 26 |
4 files changed, 49 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8d0f6c1..01fc3ef 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2013-04-11 Paolo Carlini <paolo.carlini@oracle.com> + PR c++/56913 + * typeck2.c (build_m_component_ref): Protect error calls with + (complain & tf_error). + +2013-04-11 Paolo Carlini <paolo.carlini@oracle.com> + PR c++/54216 * parser.c (cp_parser_enum_specifier): Check for empty anonymous enums and anonymous scoped enums. diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index 5c2b1b2..a0bc50b 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -1722,11 +1722,19 @@ build_m_component_ref (tree datum, tree component, tsubst_flags_t complain) { bool lval = real_lvalue_p (datum); if (lval && FUNCTION_RVALUE_QUALIFIED (type)) - error ("pointer-to-member-function type %qT requires an rvalue", - ptrmem_type); + { + if (complain & tf_error) + error ("pointer-to-member-function type %qT requires an rvalue", + ptrmem_type); + return error_mark_node; + } else if (!lval && !FUNCTION_RVALUE_QUALIFIED (type)) - error ("pointer-to-member-function type %qT requires an lvalue", - ptrmem_type); + { + if (complain & tf_error) + error ("pointer-to-member-function type %qT requires an lvalue", + ptrmem_type); + return error_mark_node; + } } return build2 (OFFSET_REF, type, datum, component); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 02639b1..58447db 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-04-11 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/56913 + * g++.dg/cpp0x/sfinae44.C: New. + 2013-04-11 Arnaud Charlet <charlet@adacore.com> * ada/acats/run_all.sh: Remove special handling of -gnat95 switch. diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae44.C b/gcc/testsuite/g++.dg/cpp0x/sfinae44.C new file mode 100644 index 0000000..bbcae62 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae44.C @@ -0,0 +1,26 @@ +// PR c++/56913 +// { dg-do compile { target c++11 } } + +template<typename T> +T &&declval(); + +template<typename T, typename U, + typename = decltype((declval<T>().*declval<U>())())> +constexpr bool test(int) +{ + return true; +} + +template<typename T, typename U> +constexpr bool test(...) +{ + return false; +} + +struct S +{}; + +static_assert(!test<S, void (S::*)() &>(0), ""); +static_assert(test<S, void (S::*)() &&>(0), ""); +static_assert(test<S &, void (S::*)() &>(0), ""); +static_assert(!test<S &, void (S::*)() &&>(0), ""); |