public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] c++: __has_builtin gives the wrong answer [PR106759]
@ 2022-08-29 21:26 Marek Polacek
  2022-08-30  3:33 ` Jason Merrill
  0 siblings, 1 reply; 2+ messages in thread
From: Marek Polacek @ 2022-08-29 21:26 UTC (permalink / raw)
  To: Jason Merrill, GCC Patches

We've supported __is_nothrow_constructible since r11-4386, but
names_builtin_p didn't know about it, so it gave the wrong answer for
 #if __has_builtin(__is_nothrow_constructible)
 ...
 #endif

I've tested all C++-only built-ins and only two were missing.

Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?

	PR c++/106759

gcc/cp/ChangeLog:

	* cp-objcp-common.cc (names_builtin_p): Handle RID_IS_NOTHROW_ASSIGNABLE
	and RID_IS_NOTHROW_CONSTRUCTIBLE.

gcc/testsuite/ChangeLog:

	* g++.dg/ext/has-builtin-1.C: New test.
---
 gcc/cp/cp-objcp-common.cc                |   2 +
 gcc/testsuite/g++.dg/ext/has-builtin-1.C | 133 +++++++++++++++++++++++
 2 files changed, 135 insertions(+)
 create mode 100644 gcc/testsuite/g++.dg/ext/has-builtin-1.C

diff --git a/gcc/cp/cp-objcp-common.cc b/gcc/cp/cp-objcp-common.cc
index 4079a4b4aec..1ffac08c32f 100644
--- a/gcc/cp/cp-objcp-common.cc
+++ b/gcc/cp/cp-objcp-common.cc
@@ -460,6 +460,8 @@ names_builtin_p (const char *name)
     case RID_IS_UNION:
     case RID_IS_ASSIGNABLE:
     case RID_IS_CONSTRUCTIBLE:
+    case RID_IS_NOTHROW_ASSIGNABLE:
+    case RID_IS_NOTHROW_CONSTRUCTIBLE:
     case RID_UNDERLYING_TYPE:
     case RID_REF_CONSTRUCTS_FROM_TEMPORARY:
     case RID_REF_CONVERTS_FROM_TEMPORARY:
diff --git a/gcc/testsuite/g++.dg/ext/has-builtin-1.C b/gcc/testsuite/g++.dg/ext/has-builtin-1.C
new file mode 100644
index 00000000000..fe25cb2f669
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/has-builtin-1.C
@@ -0,0 +1,133 @@
+// PR c++/106759
+// { dg-do compile }
+// Verify that __has_builtin gives the correct answer for C++ built-ins.
+
+#if !__has_builtin (__builtin_addressof)
+# error "__has_builtin (__builtin_addressof) failed"
+#endif
+#if !__has_builtin (__builtin_bit_cast)
+# error "__has_builtin (__builtin_bit_cast) failed"
+#endif
+#if !__has_builtin (__builtin_launder)
+# error "__has_builtin (__builtin_launder) failed"
+#endif
+#if !__has_builtin (__has_nothrow_assign)
+# error "__has_builtin (__has_nothrow_assign) failed"
+#endif
+#if !__has_builtin (__has_nothrow_constructor)
+# error "__has_builtin (__has_nothrow_constructor) failed"
+#endif
+#if !__has_builtin (__has_nothrow_copy)
+# error "__has_builtin (__has_nothrow_copy) failed"
+#endif
+#if !__has_builtin (__has_trivial_assign)
+# error "__has_builtin (__has_trivial_assign) failed"
+#endif
+#if !__has_builtin (__has_trivial_constructor)
+# error "__has_builtin (__has_trivial_constructor) failed"
+#endif
+#if !__has_builtin (__has_trivial_copy)
+# error "__has_builtin (__has_trivial_copy) failed"
+#endif
+#if !__has_builtin (__has_trivial_destructor)
+# error "__has_builtin (__has_trivial_destructor) failed"
+#endif
+#if !__has_builtin (__has_unique_object_representations)
+# error "__has_builtin (__has_unique_object_representations) failed"
+#endif
+#if !__has_builtin (__has_virtual_destructor)
+# error "__has_builtin (__has_virtual_destructor) failed"
+#endif
+#if !__has_builtin (__is_abstract)
+# error "__has_builtin (__is_abstract) failed"
+#endif
+#if !__has_builtin (__is_aggregate)
+# error "__has_builtin (__is_aggregate) failed"
+#endif
+#if !__has_builtin (__is_base_of)
+# error "__has_builtin (__is_base_of) failed"
+#endif
+#if !__has_builtin (__is_class)
+# error "__has_builtin (__is_class) failed"
+#endif
+#if !__has_builtin (__is_empty)
+# error "__has_builtin (__is_empty) failed"
+#endif
+#if !__has_builtin (__is_enum)
+# error "__has_builtin (__is_enum) failed"
+#endif
+#if !__has_builtin (__is_final)
+# error "__has_builtin (__is_final) failed"
+#endif
+#if !__has_builtin (__is_layout_compatible)
+# error "__has_builtin (__is_layout_compatible) failed"
+#endif
+#if !__has_builtin (__is_literal_type)
+# error "__has_builtin (__is_literal_type) failed"
+#endif
+#if !__has_builtin (__is_pointer_interconvertible_base_of)
+# error "__has_builtin (__is_pointer_interconvertible_base_of) failed"
+#endif
+#if !__has_builtin (__is_pod)
+# error "__has_builtin (__is_pod) failed"
+#endif
+#if !__has_builtin (__is_polymorphic)
+# error "__has_builtin (__is_polymorphic) failed"
+#endif
+#if !__has_builtin (__is_same)
+# error "__has_builtin (__is_same) failed"
+#endif
+#if !__has_builtin (__is_same_as)
+# error "__has_builtin (__is_same_as) failed"
+#endif
+#if !__has_builtin (__is_standard_layout)
+# error "__has_builtin (__is_standard_layout) failed"
+#endif
+#if !__has_builtin (__is_trivial)
+# error "__has_builtin (__is_trivial) failed"
+#endif
+#if !__has_builtin (__is_trivially_assignable)
+# error "__has_builtin (__is_trivially_assignable) failed"
+#endif
+#if !__has_builtin (__is_trivially_constructible)
+# error "__has_builtin (__is_trivially_constructible) failed"
+#endif
+#if !__has_builtin (__is_trivially_copyable)
+# error "__has_builtin (__is_trivially_copyable) failed"
+#endif
+#if !__has_builtin (__is_union)
+# error "__has_builtin (__is_union) failed"
+#endif
+#if !__has_builtin (__underlying_type)
+# error "__has_builtin (__underlying_type) failed"
+#endif
+#if !__has_builtin (__is_assignable)
+# error "__has_builtin (__is_assignable) failed"
+#endif
+#if !__has_builtin (__is_constructible)
+# error "__has_builtin (__is_constructible) failed"
+#endif
+#if !__has_builtin (__is_nothrow_assignable)
+# error "__has_builtin (__is_nothrow_assignable) failed"
+#endif
+#if !__has_builtin (__is_nothrow_constructible)
+# error "__has_builtin (__is_nothrow_constructible) failed"
+#endif
+#if !__has_builtin (__reference_constructs_from_temporary)
+# error "__has_builtin (__reference_constructs_from_temporary) failed"
+#endif
+#if !__has_builtin (__reference_converts_from_temporary)
+# error "__has_builtin (__reference_converts_from_temporary) failed"
+#endif
+#if !__has_builtin (__builtin_is_constant_evaluated)
+# error "__has_builtin (__builtin_is_constant_evaluated) failed"
+#endif
+#if !__has_builtin (__builtin_source_location)
+# error "__has_builtin (__builtin_source_location) failed"
+#endif
+#if !__has_builtin (__builtin_is_corresponding_member)
+# error "__has_builtin (__builtin_is_corresponding_member) failed"
+#endif
+#if !__has_builtin (__builtin_is_pointer_interconvertible_with_class)
+# error "__has_builtin (__builtin_is_pointer_interconvertible_with_class) failed"
+#endif

base-commit: b504149d2c92ddfcfab62ea6d1ed49ae72493e38
-- 
2.37.2


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] c++: __has_builtin gives the wrong answer [PR106759]
  2022-08-29 21:26 [PATCH] c++: __has_builtin gives the wrong answer [PR106759] Marek Polacek
@ 2022-08-30  3:33 ` Jason Merrill
  0 siblings, 0 replies; 2+ messages in thread
From: Jason Merrill @ 2022-08-30  3:33 UTC (permalink / raw)
  To: Marek Polacek, GCC Patches

On 8/29/22 17:26, Marek Polacek wrote:
> We've supported __is_nothrow_constructible since r11-4386, but
> names_builtin_p didn't know about it, so it gave the wrong answer for
>   #if __has_builtin(__is_nothrow_constructible)
>   ...
>   #endif
> 
> I've tested all C++-only built-ins and only two were missing.
> 
> Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?

OK.

> 	PR c++/106759
> 
> gcc/cp/ChangeLog:
> 
> 	* cp-objcp-common.cc (names_builtin_p): Handle RID_IS_NOTHROW_ASSIGNABLE
> 	and RID_IS_NOTHROW_CONSTRUCTIBLE.
> 
> gcc/testsuite/ChangeLog:
> 
> 	* g++.dg/ext/has-builtin-1.C: New test.
> ---
>   gcc/cp/cp-objcp-common.cc                |   2 +
>   gcc/testsuite/g++.dg/ext/has-builtin-1.C | 133 +++++++++++++++++++++++
>   2 files changed, 135 insertions(+)
>   create mode 100644 gcc/testsuite/g++.dg/ext/has-builtin-1.C
> 
> diff --git a/gcc/cp/cp-objcp-common.cc b/gcc/cp/cp-objcp-common.cc
> index 4079a4b4aec..1ffac08c32f 100644
> --- a/gcc/cp/cp-objcp-common.cc
> +++ b/gcc/cp/cp-objcp-common.cc
> @@ -460,6 +460,8 @@ names_builtin_p (const char *name)
>       case RID_IS_UNION:
>       case RID_IS_ASSIGNABLE:
>       case RID_IS_CONSTRUCTIBLE:
> +    case RID_IS_NOTHROW_ASSIGNABLE:
> +    case RID_IS_NOTHROW_CONSTRUCTIBLE:
>       case RID_UNDERLYING_TYPE:
>       case RID_REF_CONSTRUCTS_FROM_TEMPORARY:
>       case RID_REF_CONVERTS_FROM_TEMPORARY:
> diff --git a/gcc/testsuite/g++.dg/ext/has-builtin-1.C b/gcc/testsuite/g++.dg/ext/has-builtin-1.C
> new file mode 100644
> index 00000000000..fe25cb2f669
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/ext/has-builtin-1.C
> @@ -0,0 +1,133 @@
> +// PR c++/106759
> +// { dg-do compile }
> +// Verify that __has_builtin gives the correct answer for C++ built-ins.
> +
> +#if !__has_builtin (__builtin_addressof)
> +# error "__has_builtin (__builtin_addressof) failed"
> +#endif
> +#if !__has_builtin (__builtin_bit_cast)
> +# error "__has_builtin (__builtin_bit_cast) failed"
> +#endif
> +#if !__has_builtin (__builtin_launder)
> +# error "__has_builtin (__builtin_launder) failed"
> +#endif
> +#if !__has_builtin (__has_nothrow_assign)
> +# error "__has_builtin (__has_nothrow_assign) failed"
> +#endif
> +#if !__has_builtin (__has_nothrow_constructor)
> +# error "__has_builtin (__has_nothrow_constructor) failed"
> +#endif
> +#if !__has_builtin (__has_nothrow_copy)
> +# error "__has_builtin (__has_nothrow_copy) failed"
> +#endif
> +#if !__has_builtin (__has_trivial_assign)
> +# error "__has_builtin (__has_trivial_assign) failed"
> +#endif
> +#if !__has_builtin (__has_trivial_constructor)
> +# error "__has_builtin (__has_trivial_constructor) failed"
> +#endif
> +#if !__has_builtin (__has_trivial_copy)
> +# error "__has_builtin (__has_trivial_copy) failed"
> +#endif
> +#if !__has_builtin (__has_trivial_destructor)
> +# error "__has_builtin (__has_trivial_destructor) failed"
> +#endif
> +#if !__has_builtin (__has_unique_object_representations)
> +# error "__has_builtin (__has_unique_object_representations) failed"
> +#endif
> +#if !__has_builtin (__has_virtual_destructor)
> +# error "__has_builtin (__has_virtual_destructor) failed"
> +#endif
> +#if !__has_builtin (__is_abstract)
> +# error "__has_builtin (__is_abstract) failed"
> +#endif
> +#if !__has_builtin (__is_aggregate)
> +# error "__has_builtin (__is_aggregate) failed"
> +#endif
> +#if !__has_builtin (__is_base_of)
> +# error "__has_builtin (__is_base_of) failed"
> +#endif
> +#if !__has_builtin (__is_class)
> +# error "__has_builtin (__is_class) failed"
> +#endif
> +#if !__has_builtin (__is_empty)
> +# error "__has_builtin (__is_empty) failed"
> +#endif
> +#if !__has_builtin (__is_enum)
> +# error "__has_builtin (__is_enum) failed"
> +#endif
> +#if !__has_builtin (__is_final)
> +# error "__has_builtin (__is_final) failed"
> +#endif
> +#if !__has_builtin (__is_layout_compatible)
> +# error "__has_builtin (__is_layout_compatible) failed"
> +#endif
> +#if !__has_builtin (__is_literal_type)
> +# error "__has_builtin (__is_literal_type) failed"
> +#endif
> +#if !__has_builtin (__is_pointer_interconvertible_base_of)
> +# error "__has_builtin (__is_pointer_interconvertible_base_of) failed"
> +#endif
> +#if !__has_builtin (__is_pod)
> +# error "__has_builtin (__is_pod) failed"
> +#endif
> +#if !__has_builtin (__is_polymorphic)
> +# error "__has_builtin (__is_polymorphic) failed"
> +#endif
> +#if !__has_builtin (__is_same)
> +# error "__has_builtin (__is_same) failed"
> +#endif
> +#if !__has_builtin (__is_same_as)
> +# error "__has_builtin (__is_same_as) failed"
> +#endif
> +#if !__has_builtin (__is_standard_layout)
> +# error "__has_builtin (__is_standard_layout) failed"
> +#endif
> +#if !__has_builtin (__is_trivial)
> +# error "__has_builtin (__is_trivial) failed"
> +#endif
> +#if !__has_builtin (__is_trivially_assignable)
> +# error "__has_builtin (__is_trivially_assignable) failed"
> +#endif
> +#if !__has_builtin (__is_trivially_constructible)
> +# error "__has_builtin (__is_trivially_constructible) failed"
> +#endif
> +#if !__has_builtin (__is_trivially_copyable)
> +# error "__has_builtin (__is_trivially_copyable) failed"
> +#endif
> +#if !__has_builtin (__is_union)
> +# error "__has_builtin (__is_union) failed"
> +#endif
> +#if !__has_builtin (__underlying_type)
> +# error "__has_builtin (__underlying_type) failed"
> +#endif
> +#if !__has_builtin (__is_assignable)
> +# error "__has_builtin (__is_assignable) failed"
> +#endif
> +#if !__has_builtin (__is_constructible)
> +# error "__has_builtin (__is_constructible) failed"
> +#endif
> +#if !__has_builtin (__is_nothrow_assignable)
> +# error "__has_builtin (__is_nothrow_assignable) failed"
> +#endif
> +#if !__has_builtin (__is_nothrow_constructible)
> +# error "__has_builtin (__is_nothrow_constructible) failed"
> +#endif
> +#if !__has_builtin (__reference_constructs_from_temporary)
> +# error "__has_builtin (__reference_constructs_from_temporary) failed"
> +#endif
> +#if !__has_builtin (__reference_converts_from_temporary)
> +# error "__has_builtin (__reference_converts_from_temporary) failed"
> +#endif
> +#if !__has_builtin (__builtin_is_constant_evaluated)
> +# error "__has_builtin (__builtin_is_constant_evaluated) failed"
> +#endif
> +#if !__has_builtin (__builtin_source_location)
> +# error "__has_builtin (__builtin_source_location) failed"
> +#endif
> +#if !__has_builtin (__builtin_is_corresponding_member)
> +# error "__has_builtin (__builtin_is_corresponding_member) failed"
> +#endif
> +#if !__has_builtin (__builtin_is_pointer_interconvertible_with_class)
> +# error "__has_builtin (__builtin_is_pointer_interconvertible_with_class) failed"
> +#endif
> 
> base-commit: b504149d2c92ddfcfab62ea6d1ed49ae72493e38


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2022-08-30  3:33 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-08-29 21:26 [PATCH] c++: __has_builtin gives the wrong answer [PR106759] Marek Polacek
2022-08-30  3:33 ` Jason Merrill

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).