On 4/21/21 6:11 PM, Martin Sebor wrote:
> On 4/21/21 2:15 AM, Martin Liška wrote:
>> Hello.
>>
>> It's addressing the following Clang warning:
>> cp/lex.c:170:45: warning: result of comparison of constant 64 with 
>> expression of type 'enum ovl_op_code' is always true 
>> [-Wtautological-constant-out-of-range-compare]
>>
>> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
>>
>> Ready to be installed?
>> Thanks,
>> Martin
>>
>> gcc/cp/ChangeLog:
>>
>>     * cp-tree.h (STATIC_ASSERT): Prefer static assert.
>>     * lex.c (init_operators): Remove run-time check.
>> ---
>>   gcc/cp/cp-tree.h | 3 +++
>>   gcc/cp/lex.c     | 2 --
>>   2 files changed, 3 insertions(+), 2 deletions(-)
>>
>> diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
>> index 81ff375f8a5..a8f72448ea9 100644
>> --- a/gcc/cp/cp-tree.h
>> +++ b/gcc/cp/cp-tree.h
>> @@ -5916,6 +5916,9 @@ enum ovl_op_code {
>>     OVL_OP_MAX
>>   };
>>   +/* Make sure it fits in lang_decl_fn::operator_code. */
>> +STATIC_ASSERT (OVL_OP_MAX < (1 << 6));
>> +
> 
> I wonder if there's a way to test this directly by something like
> 
>   static_assert (number-of-bits (ovl_op_info_t::ovl_op_code)
>                  <= number-of-bits (lang_decl_fn::operator_code));

Good point, but I'm not aware of it. Maybe C++ people can chime in?

> 
> Also, since we are now compiling in C++ 11 mode, would using
> static_assert be appropriate?

We do:

#if __cplusplus >= 201103L
#define STATIC_ASSERT(X) \
  static_assert ((X), #X)
#else
#define STATIC_ASSERT(X) \
  typedef int assertion1[(X) ? 1 : -1] ATTRIBUTE_UNUSED
#endif

Btw. I'm going to send a patch with remove the #else branch.

Martin

> 
> Martin
> 
> 
>>   struct GTY(()) ovl_op_info_t {
>>     /* The IDENTIFIER_NODE for the operator.  */
>>     tree identifier;
>> diff --git a/gcc/cp/lex.c b/gcc/cp/lex.c
>> index 73e14b8394c..43abd019e6e 100644
>> --- a/gcc/cp/lex.c
>> +++ b/gcc/cp/lex.c
>> @@ -166,8 +166,6 @@ init_operators (void)
>>           if (op_ptr->name)
>>       {
>> -      /* Make sure it fits in lang_decl_fn::operator_code. */
>> -      gcc_checking_assert (op_ptr->ovl_op_code < (1 << 6));
>>         tree ident = set_operator_ident (op_ptr);
>>         if (unsigned index = IDENTIFIER_CP_INDEX (ident))
>>           {
>>
> 

Reply via email to