c++: Don't add built-in operator for ++ on bool.

This feels extremely obscure but at least it's an opportunity to fix the
comments.  P0002R1 removed deprecated operator++(bool) in C++17 so let's
avoid adding a builtin overload candidate for ++ when the type is bool.

	* call.c (add_builtin_candidate): Don't create a builtin overload
	candidate for ++ when type is bool in C++17.

	* g++.dg/overload/builtin5.C: New test.
This commit is contained in:
Marek Polacek 2020-05-15 10:59:01 -04:00
parent 642dc602f8
commit 100fdb1f09
4 changed files with 42 additions and 8 deletions

View File

@ -1,4 +1,9 @@
2020-05-17 Marek Polacek <polacek@redhat.com>
2020-05-18 Marek Polacek <polacek@redhat.com>
* call.c (add_builtin_candidate): Don't create a builtin overload
candidate for ++ when type is bool in C++17.
2020-05-18 Marek Polacek <polacek@redhat.com>
* cfns.h: Regenerated.

View File

@ -2672,19 +2672,19 @@ add_builtin_candidate (struct z_candidate **candidates, enum tree_code code,
switch (code)
{
/* 4 For every pair T, VQ), where T is an arithmetic or enumeration type,
/* 4 For every pair (T, VQ), where T is an arithmetic type other than bool,
and VQ is either volatile or empty, there exist candidate operator
functions of the form
VQ T& operator++(VQ T&);
T operator++(VQ T&, int);
5 For every pair T, VQ), where T is an enumeration type or an arithmetic
type other than bool, and VQ is either volatile or empty, there exist
candidate operator functions of the form
5 For every pair (T, VQ), where T is an arithmetic type other than bool,
and VQ is either volatile or empty, there exist candidate operator
functions of the form
VQ T& operator--(VQ T&);
T operator--(VQ T&, int);
6 For every pair T, VQ), where T is a cv-qualified or cv-unqualified
complete object type, and VQ is either volatile or empty, there exist
candidate operator functions of the form
6 For every pair (T, VQ), where T is a cv-qualified or cv-unqualified object
type, and VQ is either volatile or empty, there exist candidate operator
functions of the form
T*VQ& operator++(T*VQ&);
T*VQ& operator--(T*VQ&);
T* operator++(T*VQ&, int);
@ -2697,6 +2697,10 @@ add_builtin_candidate (struct z_candidate **candidates, enum tree_code code,
/* FALLTHRU */
case POSTINCREMENT_EXPR:
case PREINCREMENT_EXPR:
/* P0002R1, Remove deprecated operator++(bool) added "other than bool"
to p4. */
if (TREE_CODE (type1) == BOOLEAN_TYPE && cxx_dialect >= cxx17)
return;
if (ARITHMETIC_TYPE_P (type1) || TYPE_PTROB_P (type1))
{
type1 = build_reference_type (type1);

View File

@ -1,3 +1,7 @@
2020-05-18 Marek Polacek <polacek@redhat.com>
* g++.dg/overload/builtin5.C: New test.
2020-05-18 Doug Rupp <rupp@adacore.com>
* gcc.target/powerpc/pr71763.c: Require powerpc_vsx_ok.

View File

@ -0,0 +1,21 @@
// { dg-do compile { target c++17 } }
// Don't add built-in operator for ++ on bool.
template<typename T>
struct S { operator T&(); };
template<int> void
foo (S<bool>& s)
{
--s; // { dg-error "no match for" }
++s; // { dg-error "no match for" }
s++; // { dg-error "declared for postfix" }
s--; // { dg-error "declared for postfix" }
}
void
bar ()
{
S<bool> s;
foo<0> (s);
}