[cfe-dev] Surprising cast

Abramo Bagnara abramo.bagnara at gmail.com
Fri Dec 17 04:28:35 PST 2010


Il 11/12/2010 23:33, John McCall ha scritto:
> On Dec 11, 2010, at 9:21 AM, Abramo Bagnara wrote:
>> $ cat p.c
>> enum {
>>  a = 1
>> };
>> $ clang -cc1 -ast-dump p.c
>> typedef char *__builtin_va_list;
>> enum  {
>>    a = (ImplicitCastExpr 0xb9e11f0 <p.c:2:7> 'int' <IntegralCast>
>>  (IntegerLiteral 0xb9e11a0 <col:7> 'int' 1))
>>
>> };
>>
>> The implicit cast from int to int is deliberate?
> 
> Seems unnecessary to me;  probably something is just making an explicit expression instead of using ImpCastExprToType (which would be appropriate here, I think).

Fixed in r122056.

A similar problem is this one:

$ cat p.cc

void foo() {
  short s = (short) 1.3;
  short t = (short) 2;
}
$ clang++ -cc1 -ast-dump p.cc
typedef char *__builtin_va_list;
void foo() (CompoundStmt 0xc00ae08 <p.cc:2:12, line:5:1>
  (DeclStmt 0xc00ad30 <line:3:3, col:24>
    0xc00aca0 "short s =
      (CStyleCastExpr 0xc00ad10 <col:13, col:21> 'short' <NoOp>
        (ImplicitCastExpr 0xc00ad00 <col:21> 'short' <FloatingToIntegral>
          (FloatingLiteral 0xc00ace0 <col:21> 'double' 1.300000e+00)))")
  (DeclStmt 0xc00adf0 <line:4:3, col:22>
    0xc00ad60 "short t =
      (CStyleCastExpr 0xc00add0 <col:13, col:21> 'short' <NoOp>
        (ImplicitCastExpr 0xc00adc0 <col:21> 'short' <IntegralCast>
          (IntegerLiteral 0xc00ada0 <col:21> 'int' 2)))"))

For unknown reasons the CStyleCastExpr is always converted to a NoOp and
an unneeded ImplicitCastExpr is added...

This happens only for C++... it is very weird IMHO.

What do you think about that?




More information about the cfe-dev mailing list