mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-02-26 19:16:20 +08:00
C _BitInt incremental fixes [PR102989]
On Wed, Aug 09, 2023 at 09:17:57PM +0000, Joseph Myers wrote: > > - _Complex _BitInt(N) isn't supported; again mainly because none of the psABIs > > mention how those should be passed/returned; in a limited way they are > > supported internally because the internal functions into which > > __builtin_{add,sub,mul}_overflow{,_p} is lowered return COMPLEX_TYPE as a > > hack to return 2 values without using references/pointers > > What happens when the usual arithmetic conversions are applied to > operands, one of which is a complex integer type and the other of which is > a wider _BitInt type? I don't see anything in the code to disallow this > case (which would produce an expression with a _Complex _BitInt type), or > any testcases for it. I've added a sorry for that case (+ return the narrower COMPLEX_TYPE). Also added testcase to verify we don't create VECTOR_TYPEs of BITINT_TYPE even if they have mode precision and suitable size (others were rejected already before). > Other testcases I think should be present (along with any corresponding > changes needed to the code itself): > > * Verifying that the new integer constant suffix is rejected for C++. Done. > * Verifying appropriate pedwarn-if-pedantic for the new constant suffix > for versions of C before C2x (and probably for use of _BitInt type > specifiers before C2x as well) - along with the expected -Wc11-c2x-compat > handling (in C2x mode) / -pedantic -Wno-c11-c2x-compat in older modes. Done. Here is an incremental patch which does that. 2023-09-06 Jakub Jelinek <jakub@redhat.com> PR c/102989 gcc/c/ * c-decl.cc (finish_declspecs): Emit pedwarn_c11 on _BitInt. * c-typeck.cc (c_common_type): Emit sorry for common type between _Complex integer and larger _BitInt and return the _Complex integer. gcc/c-family/ * c-attribs.cc (type_valid_for_vector_size): Reject vector types with BITINT_TYPE elements even if they have mode precision and suitable size. gcc/testsuite/ * gcc.dg/bitint-19.c: New test. * gcc.dg/bitint-20.c: New test. * gcc.dg/bitint-21.c: New test. * gcc.dg/bitint-22.c: New test. * gcc.dg/bitint-23.c: New test. * gcc.dg/bitint-24.c: New test. * gcc.dg/bitint-25.c: New test. * gcc.dg/bitint-26.c: New test. * gcc.dg/bitint-27.c: New test. * g++.dg/ext/bitint1.C: New test. * g++.dg/ext/bitint2.C: New test. * g++.dg/ext/bitint3.C: New test. * g++.dg/ext/bitint4.C: New test. libcpp/ * expr.cc (cpp_classify_number): Diagnose wb literal suffixes for -pedantic* before C2X or -Wc11-c2x-compat.
This commit is contained in:
parent
a2f50aa2c5
commit
f76ae4369c
@ -4366,7 +4366,8 @@ type_valid_for_vector_size (tree type, tree atname, tree args,
|
||||
&& GET_MODE_CLASS (orig_mode) != MODE_INT
|
||||
&& !ALL_SCALAR_FIXED_POINT_MODE_P (orig_mode))
|
||||
|| !tree_fits_uhwi_p (TYPE_SIZE_UNIT (type))
|
||||
|| TREE_CODE (type) == BOOLEAN_TYPE)
|
||||
|| TREE_CODE (type) == BOOLEAN_TYPE
|
||||
|| TREE_CODE (type) == BITINT_TYPE)
|
||||
{
|
||||
if (error_p)
|
||||
error ("invalid vector type for attribute %qE", atname);
|
||||
|
@ -12934,8 +12934,15 @@ finish_declspecs (struct c_declspecs *specs)
|
||||
if (specs->u.bitint_prec == -1)
|
||||
specs->type = integer_type_node;
|
||||
else
|
||||
specs->type = build_bitint_type (specs->u.bitint_prec,
|
||||
specs->unsigned_p);
|
||||
{
|
||||
pedwarn_c11 (specs->locations[cdw_typespec], OPT_Wpedantic,
|
||||
"ISO C does not support %<%s_BitInt(%d)%> before C2X",
|
||||
specs->unsigned_p ? "unsigned "
|
||||
: specs->signed_p ? "signed " : "",
|
||||
specs->u.bitint_prec);
|
||||
specs->type = build_bitint_type (specs->u.bitint_prec,
|
||||
specs->unsigned_p);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
gcc_unreachable ();
|
||||
|
@ -817,6 +817,12 @@ c_common_type (tree t1, tree t2)
|
||||
return t1;
|
||||
else if (code2 == COMPLEX_TYPE && TREE_TYPE (t2) == subtype)
|
||||
return t2;
|
||||
else if (TREE_CODE (subtype) == BITINT_TYPE)
|
||||
{
|
||||
sorry ("%<_Complex _BitInt(%d)%> unsupported",
|
||||
TYPE_PRECISION (subtype));
|
||||
return code1 == COMPLEX_TYPE ? t1 : t2;
|
||||
}
|
||||
else
|
||||
return build_complex_type (subtype);
|
||||
}
|
||||
|
9
gcc/testsuite/g++.dg/ext/bitint1.C
Normal file
9
gcc/testsuite/g++.dg/ext/bitint1.C
Normal file
@ -0,0 +1,9 @@
|
||||
// PR c/102989
|
||||
// { dg-do compile }
|
||||
|
||||
_BitInt(63) a; // { dg-error "expected" }
|
||||
unsigned _BitInt(31) b; // { dg-error "expected" }
|
||||
int c = 21wb; // { dg-error "invalid suffix \"wb\" on integer constant" "" { target c++98_only } }
|
||||
// { dg-error "unable to find numeric literal operator 'operator\"\"wb'" "" { target c++11 } .-1 }
|
||||
long long d = 60594869054uwb; // { dg-error "invalid suffix \"uwb\" on integer constant" "" { target c++98_only } }
|
||||
// { dg-error "unable to find numeric literal operator 'operator\"\"uwb'" "" { target c++11 } .-1 }
|
10
gcc/testsuite/g++.dg/ext/bitint2.C
Normal file
10
gcc/testsuite/g++.dg/ext/bitint2.C
Normal file
@ -0,0 +1,10 @@
|
||||
// PR c/102989
|
||||
// { dg-do compile }
|
||||
// { dg-options "" }
|
||||
|
||||
_BitInt(63) a; // { dg-error "expected" }
|
||||
unsigned _BitInt(31) b; // { dg-error "expected" }
|
||||
int c = 21wb; // { dg-error "invalid suffix \"wb\" on integer constant" "" { target c++98_only } }
|
||||
// { dg-error "unable to find numeric literal operator 'operator\"\"wb'" "" { target c++11 } .-1 }
|
||||
long long d = 60594869054uwb; // { dg-error "invalid suffix \"uwb\" on integer constant" "" { target c++98_only } }
|
||||
// { dg-error "unable to find numeric literal operator 'operator\"\"uwb'" "" { target c++11 } .-1 }
|
8
gcc/testsuite/g++.dg/ext/bitint3.C
Normal file
8
gcc/testsuite/g++.dg/ext/bitint3.C
Normal file
@ -0,0 +1,8 @@
|
||||
// PR c/102989
|
||||
// { dg-do compile { target c++11 } }
|
||||
|
||||
constexpr int operator""wb (unsigned long long) { return 0; } // { dg-warning "reserved for future standardization" }
|
||||
constexpr int operator""uwb (unsigned long long) { return 1; } // { dg-warning "reserved for future standardization" }
|
||||
|
||||
static_assert (-42wb == 0, "");
|
||||
static_assert (81uwb == 1, "");
|
9
gcc/testsuite/g++.dg/ext/bitint4.C
Normal file
9
gcc/testsuite/g++.dg/ext/bitint4.C
Normal file
@ -0,0 +1,9 @@
|
||||
// PR c/102989
|
||||
// { dg-do compile { target c++11 } }
|
||||
// { dg-options "" }
|
||||
|
||||
constexpr int operator""wb (unsigned long long) { return 0; } // { dg-warning "reserved for future standardization" }
|
||||
constexpr int operator""uwb (unsigned long long) { return 1; } // { dg-warning "reserved for future standardization" }
|
||||
|
||||
static_assert (-42wb == 0, "");
|
||||
static_assert (81uwb == 1, "");
|
16
gcc/testsuite/gcc.dg/bitint-19.c
Normal file
16
gcc/testsuite/gcc.dg/bitint-19.c
Normal file
@ -0,0 +1,16 @@
|
||||
/* PR c/102989 */
|
||||
/* { dg-do compile { target bitint } } */
|
||||
/* { dg-options "-std=gnu2x" } */
|
||||
|
||||
#define expr_has_type(e, t) _Generic (e, default : 0, t : 1)
|
||||
|
||||
void
|
||||
foo (_Complex int ci, _Complex long long cl)
|
||||
{
|
||||
_BitInt(__SIZEOF_INT__ * __CHAR_BIT__ - 1) bi = 0wb;
|
||||
_BitInt(__SIZEOF_LONG_LONG__ * __CHAR_BIT__ - 1) bl = 0wb;
|
||||
static_assert (expr_has_type (ci + bi, _Complex int));
|
||||
static_assert (expr_has_type (cl + bl, _Complex long long));
|
||||
static_assert (expr_has_type (bi + ci, _Complex int));
|
||||
static_assert (expr_has_type (bl + cl, _Complex long long));
|
||||
}
|
16
gcc/testsuite/gcc.dg/bitint-20.c
Normal file
16
gcc/testsuite/gcc.dg/bitint-20.c
Normal file
@ -0,0 +1,16 @@
|
||||
/* PR c/102989 */
|
||||
/* { dg-do compile { target bitint } } */
|
||||
/* { dg-options "-std=gnu2x" } */
|
||||
|
||||
void
|
||||
foo (_Complex int ci, _Complex long long cl)
|
||||
{
|
||||
_BitInt(__SIZEOF_INT__ * __CHAR_BIT__ + 1) bi = 0wb;
|
||||
ci + bi; /* { dg-message "unsupported" } */
|
||||
bi + ci; /* { dg-message "unsupported" } */
|
||||
#if __BITINT_MAXWIDTH__ >= 575
|
||||
_BitInt(575) bw = 0wb;
|
||||
cl + bw; /* { dg-message "unsupported" "" { target bitint575 } } */
|
||||
bw + cl; /* { dg-message "unsupported" "" { target bitint575 } } */
|
||||
#endif
|
||||
}
|
11
gcc/testsuite/gcc.dg/bitint-21.c
Normal file
11
gcc/testsuite/gcc.dg/bitint-21.c
Normal file
@ -0,0 +1,11 @@
|
||||
/* PR c/102989 */
|
||||
/* { dg-do compile { target bitint } } */
|
||||
/* { dg-options "-std=gnu2x" } */
|
||||
|
||||
#define IB __SIZEOF_INT__ * __CHAR_BIT__
|
||||
typedef _BitInt(IB) V1 __attribute__((vector_size (sizeof (_BitInt(IB))))); /* { dg-error "invalid vector type for attribute 'vector_size'" } */
|
||||
typedef _BitInt(IB) V2 __attribute__((vector_size (8 * sizeof (_BitInt(IB))))); /* { dg-error "invalid vector type for attribute 'vector_size'" } */
|
||||
#if __BITINT_MAXWIDTH__ >= 575
|
||||
typedef _BitInt(575) V3 __attribute__((vector_size (sizeof (_BitInt(575))))); /* { dg-error "invalid vector type for attribute 'vector_size'" "" { target bitint575 } } */
|
||||
typedef _BitInt(575) V3 __attribute__((vector_size (16 * sizeof (_BitInt(575))))); /* { dg-error "invalid vector type for attribute 'vector_size'" "" { target bitint575 } } */
|
||||
#endif
|
18
gcc/testsuite/gcc.dg/bitint-22.c
Normal file
18
gcc/testsuite/gcc.dg/bitint-22.c
Normal file
@ -0,0 +1,18 @@
|
||||
// PR c/102989
|
||||
// { dg-do compile { target bitint } }
|
||||
// { dg-options "-std=c2x -pedantic-errors" }
|
||||
|
||||
_BitInt(63) a;
|
||||
signed _BitInt(15) b;
|
||||
unsigned _BitInt(31) c;
|
||||
int d = 21wb;
|
||||
long long e = 60594869054uwb;
|
||||
__extension__ _BitInt(63) f;
|
||||
__extension__ _BitInt(15) g;
|
||||
__extension__ unsigned _BitInt(31) h;
|
||||
int i = __extension__ 21wb;
|
||||
long long j = __extension__ 60594869054uwb;
|
||||
#if 0wb == 0
|
||||
#endif
|
||||
#if 0uwb == 0
|
||||
#endif
|
18
gcc/testsuite/gcc.dg/bitint-23.c
Normal file
18
gcc/testsuite/gcc.dg/bitint-23.c
Normal file
@ -0,0 +1,18 @@
|
||||
// PR c/102989
|
||||
// { dg-do compile { target bitint } }
|
||||
// { dg-options "-std=c2x -pedantic-errors -Wc11-c2x-compat" }
|
||||
|
||||
_BitInt(63) a; /* { dg-warning "ISO C does not support '_BitInt\\\(63\\\)' before C2X" } */
|
||||
signed _BitInt(15) b; /* { dg-warning "ISO C does not support 'signed _BitInt\\\(15\\\)' before C2X" } */
|
||||
unsigned _BitInt(31) c; /* { dg-warning "ISO C does not support 'unsigned _BitInt\\\(31\\\)' before C2X" } */
|
||||
int d = 21wb; /* { dg-warning "ISO C does not support literal 'wb' suffixes before C2X" } */
|
||||
long long e = 60594869054uwb; /* { dg-warning "ISO C does not support literal 'wb' suffixes before C2X" } */
|
||||
__extension__ _BitInt(63) f;
|
||||
__extension__ _BitInt(15) g;
|
||||
__extension__ unsigned _BitInt(31) h;
|
||||
int i = __extension__ 21wb;
|
||||
long long j = __extension__ 60594869054uwb;
|
||||
#if 0wb == 0 /* { dg-warning "ISO C does not support literal 'wb' suffixes before C2X" } */
|
||||
#endif
|
||||
#if 0uwb == 0 /* { dg-warning "ISO C does not support literal 'wb' suffixes before C2X" } */
|
||||
#endif
|
18
gcc/testsuite/gcc.dg/bitint-24.c
Normal file
18
gcc/testsuite/gcc.dg/bitint-24.c
Normal file
@ -0,0 +1,18 @@
|
||||
// PR c/102989
|
||||
// { dg-do compile { target bitint } }
|
||||
// { dg-options "-std=c11" }
|
||||
|
||||
_BitInt(63) a;
|
||||
signed _BitInt(15) b;
|
||||
unsigned _BitInt(31) c;
|
||||
int d = 21wb;
|
||||
long long e = 60594869054uwb;
|
||||
__extension__ _BitInt(63) f;
|
||||
__extension__ _BitInt(15) g;
|
||||
__extension__ unsigned _BitInt(31) h;
|
||||
int i = __extension__ 21wb;
|
||||
long long j = __extension__ 60594869054uwb;
|
||||
#if 0wb == 0
|
||||
#endif
|
||||
#if 0uwb == 0
|
||||
#endif
|
18
gcc/testsuite/gcc.dg/bitint-25.c
Normal file
18
gcc/testsuite/gcc.dg/bitint-25.c
Normal file
@ -0,0 +1,18 @@
|
||||
// PR c/102989
|
||||
// { dg-do compile { target bitint } }
|
||||
// { dg-options "-std=c11 -Wno-c11-c2x-compat -pedantic-errors" }
|
||||
|
||||
_BitInt(63) a;
|
||||
signed _BitInt(15) b;
|
||||
unsigned _BitInt(31) c;
|
||||
int d = 21wb;
|
||||
long long e = 60594869054uwb;
|
||||
__extension__ _BitInt(63) f;
|
||||
__extension__ _BitInt(15) g;
|
||||
__extension__ unsigned _BitInt(31) h;
|
||||
int i = __extension__ 21wb;
|
||||
long long j = __extension__ 60594869054uwb;
|
||||
#if 0wb == 0
|
||||
#endif
|
||||
#if 0uwb == 0
|
||||
#endif
|
18
gcc/testsuite/gcc.dg/bitint-26.c
Normal file
18
gcc/testsuite/gcc.dg/bitint-26.c
Normal file
@ -0,0 +1,18 @@
|
||||
// PR c/102989
|
||||
// { dg-do compile { target bitint } }
|
||||
// { dg-options "-std=c11 -pedantic" }
|
||||
|
||||
_BitInt(63) a; /* { dg-warning "ISO C does not support '_BitInt\\\(63\\\)' before C2X" } */
|
||||
signed _BitInt(15) b; /* { dg-warning "ISO C does not support 'signed _BitInt\\\(15\\\)' before C2X" } */
|
||||
unsigned _BitInt(31) c; /* { dg-warning "ISO C does not support 'unsigned _BitInt\\\(31\\\)' before C2X" } */
|
||||
int d = 21wb; /* { dg-warning "ISO C does not support literal 'wb' suffixes before C2X" } */
|
||||
long long e = 60594869054uwb; /* { dg-warning "ISO C does not support literal 'wb' suffixes before C2X" } */
|
||||
__extension__ _BitInt(63) f;
|
||||
__extension__ _BitInt(15) g;
|
||||
__extension__ unsigned _BitInt(31) h;
|
||||
int i = __extension__ 21wb;
|
||||
long long j = __extension__ 60594869054uwb;
|
||||
#if 0wb == 0 /* { dg-warning "ISO C does not support literal 'wb' suffixes before C2X" } */
|
||||
#endif
|
||||
#if 0uwb == 0 /* { dg-warning "ISO C does not support literal 'wb' suffixes before C2X" } */
|
||||
#endif
|
18
gcc/testsuite/gcc.dg/bitint-27.c
Normal file
18
gcc/testsuite/gcc.dg/bitint-27.c
Normal file
@ -0,0 +1,18 @@
|
||||
// PR c/102989
|
||||
// { dg-do compile { target bitint } }
|
||||
// { dg-options "-std=c11 -pedantic-errors" }
|
||||
|
||||
_BitInt(63) a; /* { dg-error "ISO C does not support '_BitInt\\\(63\\\)' before C2X" } */
|
||||
signed _BitInt(15) b; /* { dg-error "ISO C does not support 'signed _BitInt\\\(15\\\)' before C2X" } */
|
||||
unsigned _BitInt(31) c; /* { dg-error "ISO C does not support 'unsigned _BitInt\\\(31\\\)' before C2X" } */
|
||||
int d = 21wb; /* { dg-error "ISO C does not support literal 'wb' suffixes before C2X" } */
|
||||
long long e = 60594869054uwb; /* { dg-error "ISO C does not support literal 'wb' suffixes before C2X" } */
|
||||
__extension__ _BitInt(63) f;
|
||||
__extension__ _BitInt(15) g;
|
||||
__extension__ unsigned _BitInt(31) h;
|
||||
int i = __extension__ 21wb;
|
||||
long long j = __extension__ 60594869054uwb;
|
||||
#if 0wb == 0 /* { dg-error "ISO C does not support literal 'wb' suffixes before C2X" } */
|
||||
#endif
|
||||
#if 0uwb == 0 /* { dg-error "ISO C does not support literal 'wb' suffixes before C2X" } */
|
||||
#endif
|
@ -856,6 +856,29 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token,
|
||||
virtual_location, 0, message);
|
||||
}
|
||||
|
||||
if ((result & CPP_N_BITINT) != 0
|
||||
&& CPP_OPTION (pfile, cpp_warn_c11_c2x_compat) != 0)
|
||||
{
|
||||
if (CPP_OPTION (pfile, cpp_warn_c11_c2x_compat) > 0)
|
||||
{
|
||||
const char *message = N_("ISO C does not support literal "
|
||||
"%<wb%> suffixes before C2X");
|
||||
if (CPP_PEDANTIC (pfile) && !CPP_OPTION (pfile, true_false))
|
||||
cpp_pedwarning_with_line (pfile, CPP_W_C11_C2X_COMPAT,
|
||||
virtual_location, 0, message);
|
||||
else
|
||||
cpp_warning_with_line (pfile, CPP_W_C11_C2X_COMPAT,
|
||||
virtual_location, 0, message);
|
||||
}
|
||||
else if (CPP_PEDANTIC (pfile) && !CPP_OPTION (pfile, true_false))
|
||||
{
|
||||
const char *message = N_("ISO C does not support literal "
|
||||
"%<wb%> suffixes before C2X");
|
||||
cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
|
||||
message);
|
||||
}
|
||||
}
|
||||
|
||||
result |= CPP_N_INTEGER;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user