c++: make __is_array return false for T[0] [PR114479]
When we switched to using the __is_array built-in trait to implement std::is_array in r14-6623-g7fd9c349e45534, we started saying that T[0] is an array. There are various opinions as to whether that is the best answer, but it seems prudent to keep the GCC 13 result. PR c++/114479 gcc/cp/ChangeLog: * semantics.cc (trait_expr_value) <case CPTK_IS_ARRAY>: Return false for zero-sized arrays. gcc/testsuite/ChangeLog: * g++.dg/ext/is_array.C: Extend.
This commit is contained in:
parent
daa2e7c7ff
commit
2f2924078c
2 changed files with 19 additions and 1 deletions
|
@ -12439,7 +12439,13 @@ trait_expr_value (cp_trait_kind kind, tree type1, tree type2)
|
|||
return CP_AGGREGATE_TYPE_P (type1);
|
||||
|
||||
case CPTK_IS_ARRAY:
|
||||
return type_code1 == ARRAY_TYPE;
|
||||
return (type_code1 == ARRAY_TYPE
|
||||
/* We don't want to report T[0] as being an array type.
|
||||
This is for compatibility with an implementation of
|
||||
std::is_array by template argument deduction, because
|
||||
compute_array_index_type_loc rejects a zero-size array
|
||||
in SFINAE context. */
|
||||
&& !(TYPE_SIZE (type1) && integer_zerop (TYPE_SIZE (type1))));
|
||||
|
||||
case CPTK_IS_ASSIGNABLE:
|
||||
return is_xible (MODIFY_EXPR, type1, type2);
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
// { dg-do compile { target c++11 } }
|
||||
// { dg-options "" }
|
||||
|
||||
#define SA(X) static_assert((X),#X)
|
||||
|
||||
|
@ -10,18 +11,29 @@
|
|||
|
||||
class ClassType { };
|
||||
|
||||
constexpr int sz0 = 0;
|
||||
constexpr int sz2 = 2;
|
||||
|
||||
SA_TEST_CATEGORY(__is_array, int[2], true);
|
||||
SA_TEST_CATEGORY(__is_array, int[], true);
|
||||
SA_TEST_CATEGORY(__is_array, int[0], false);
|
||||
SA_TEST_CATEGORY(__is_array, int[2][3], true);
|
||||
SA_TEST_CATEGORY(__is_array, int[][3], true);
|
||||
SA_TEST_CATEGORY(__is_array, int[0][3], false);
|
||||
SA_TEST_CATEGORY(__is_array, int[3][0], false);
|
||||
SA_TEST_CATEGORY(__is_array, float*[2], true);
|
||||
SA_TEST_CATEGORY(__is_array, float*[], true);
|
||||
SA_TEST_CATEGORY(__is_array, float*[2][3], true);
|
||||
SA_TEST_CATEGORY(__is_array, float*[][3], true);
|
||||
SA_TEST_CATEGORY(__is_array, ClassType[2], true);
|
||||
SA_TEST_CATEGORY(__is_array, ClassType[], true);
|
||||
SA_TEST_CATEGORY(__is_array, ClassType[0], false);
|
||||
SA_TEST_CATEGORY(__is_array, ClassType[2][3], true);
|
||||
SA_TEST_CATEGORY(__is_array, ClassType[][3], true);
|
||||
SA_TEST_CATEGORY(__is_array, ClassType[0][3], false);
|
||||
SA_TEST_CATEGORY(__is_array, ClassType[2][0], false);
|
||||
SA_TEST_CATEGORY(__is_array, int[sz2], true);
|
||||
SA_TEST_CATEGORY(__is_array, int[sz0], false);
|
||||
|
||||
// Sanity check.
|
||||
SA_TEST_CATEGORY(__is_array, ClassType, false);
|
||||
|
|
Loading…
Add table
Reference in a new issue