Skip to content

Commit

Permalink
c++: Implement __is_unbounded_array built-in trait
Browse files Browse the repository at this point in the history
This patch implements built-in trait for std::is_unbounded_array.

gcc/cp/ChangeLog:

	* cp-trait.def: Define __is_unbounded_array.
	* constraint.cc (diagnose_trait_expr): Handle
	CPTK_IS_UNBOUNDED_ARRAY.
	* semantics.cc (trait_expr_value): Likewise.
	(finish_trait_expr): Likewise.

gcc/testsuite/ChangeLog:

	* g++.dg/ext/has-builtin-1.C: Test existence of
	__is_unbounded_array.
	* g++.dg/ext/is_unbounded_array.C: New test.

Signed-off-by: Ken Matsui <kmatsui@gcc.gnu.org>
  • Loading branch information
ken-matsui authored and ouuleilei-bot committed Oct 24, 2023
1 parent 04aa840 commit 11ed329
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 0 deletions.
3 changes: 3 additions & 0 deletions gcc/cp/constraint.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3809,6 +3809,9 @@ diagnose_trait_expr (tree expr, tree args)
case CPTK_IS_TRIVIALLY_COPYABLE:
inform (loc, " %qT is not trivially copyable", t1);
break;
case CPTK_IS_UNBOUNDED_ARRAY:
inform (loc, " %qT is not an unbounded array", t1);
break;
case CPTK_IS_UNION:
inform (loc, " %qT is not a union", t1);
break;
Expand Down
1 change: 1 addition & 0 deletions gcc/cp/cp-trait.def
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ DEFTRAIT_EXPR (IS_TRIVIAL, "__is_trivial", 1)
DEFTRAIT_EXPR (IS_TRIVIALLY_ASSIGNABLE, "__is_trivially_assignable", 2)
DEFTRAIT_EXPR (IS_TRIVIALLY_CONSTRUCTIBLE, "__is_trivially_constructible", -1)
DEFTRAIT_EXPR (IS_TRIVIALLY_COPYABLE, "__is_trivially_copyable", 1)
DEFTRAIT_EXPR (IS_UNBOUNDED_ARRAY, "__is_unbounded_array", 1)
DEFTRAIT_EXPR (IS_UNION, "__is_union", 1)
DEFTRAIT_EXPR (IS_VOLATILE, "__is_volatile", 1)
DEFTRAIT_EXPR (REF_CONSTRUCTS_FROM_TEMPORARY, "__reference_constructs_from_temporary", 2)
Expand Down
4 changes: 4 additions & 0 deletions gcc/cp/semantics.cc
Original file line number Diff line number Diff line change
Expand Up @@ -12082,6 +12082,9 @@ trait_expr_value (cp_trait_kind kind, tree type1, tree type2)
case CPTK_IS_TRIVIALLY_COPYABLE:
return trivially_copyable_p (type1);

case CPTK_IS_UNBOUNDED_ARRAY:
return array_of_unknown_bound_p (type1);

case CPTK_IS_UNION:
return type_code1 == UNION_TYPE;

Expand Down Expand Up @@ -12249,6 +12252,7 @@ finish_trait_expr (location_t loc, cp_trait_kind kind, tree type1, tree type2)
case CPTK_IS_CONST:
case CPTK_IS_ENUM:
case CPTK_IS_SAME:
case CPTK_IS_UNBOUNDED_ARRAY:
case CPTK_IS_UNION:
case CPTK_IS_VOLATILE:
break;
Expand Down
3 changes: 3 additions & 0 deletions gcc/testsuite/g++.dg/ext/has-builtin-1.C
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,9 @@
#if !__has_builtin (__is_trivially_copyable)
# error "__has_builtin (__is_trivially_copyable) failed"
#endif
#if !__has_builtin (__is_unbounded_array)
# error "__has_builtin (__is_unbounded_array) failed"
#endif
#if !__has_builtin (__is_union)
# error "__has_builtin (__is_union) failed"
#endif
Expand Down
37 changes: 37 additions & 0 deletions gcc/testsuite/g++.dg/ext/is_unbounded_array.C
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// { dg-do compile { target c++11 } }

#include <testsuite_tr1.h>

using namespace __gnu_test;

#define SA(X) static_assert((X),#X)

#define SA_TEST_CATEGORY(TRAIT, TYPE, EXPECT) \
SA(TRAIT(TYPE) == EXPECT); \
SA(TRAIT(const TYPE) == EXPECT); \
SA(TRAIT(volatile TYPE) == EXPECT); \
SA(TRAIT(const volatile TYPE) == EXPECT)

SA_TEST_CATEGORY(__is_unbounded_array, int[2], false);
SA_TEST_CATEGORY(__is_unbounded_array, int[], true);
SA_TEST_CATEGORY(__is_unbounded_array, int[2][3], false);
SA_TEST_CATEGORY(__is_unbounded_array, int[][3], true);
SA_TEST_CATEGORY(__is_unbounded_array, float*[2], false);
SA_TEST_CATEGORY(__is_unbounded_array, float*[], true);
SA_TEST_CATEGORY(__is_unbounded_array, float*[2][3], false);
SA_TEST_CATEGORY(__is_unbounded_array, float*[][3], true);
SA_TEST_CATEGORY(__is_unbounded_array, ClassType[2], false);
SA_TEST_CATEGORY(__is_unbounded_array, ClassType[], true);
SA_TEST_CATEGORY(__is_unbounded_array, ClassType[2][3], false);
SA_TEST_CATEGORY(__is_unbounded_array, ClassType[][3], true);
SA_TEST_CATEGORY(__is_unbounded_array, IncompleteClass[2][3], false);
SA_TEST_CATEGORY(__is_unbounded_array, IncompleteClass[][3], true);
SA_TEST_CATEGORY(__is_unbounded_array, int(*)[2], false);
SA_TEST_CATEGORY(__is_unbounded_array, int(*)[], false);
SA_TEST_CATEGORY(__is_unbounded_array, int(&)[2], false);
SA_TEST_CATEGORY(__is_unbounded_array, int(&)[], false);

// Sanity check.
SA_TEST_CATEGORY(__is_unbounded_array, ClassType, false);
SA_TEST_CATEGORY(__is_unbounded_array, IncompleteClass, false);
SA_TEST_CATEGORY(__is_unbounded_array, IncompleteUnion, false);

0 comments on commit 11ed329

Please sign in to comment.