Nested implicit casts?

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Nested implicit casts?

Enea Zaffanella
Hello.

Dumping the AST for the following program:

int f(signed char v) { return v < 1U; }

we obtain an implicit cast expression that (immediately) contains
another implicit cast expression:

int f(signed char v) (CompoundStmt 0x174c530 <test.c:1:22, col:39>
   (ReturnStmt 0x174c510 <col:24, col:35>
     (BinaryOperator 0x174c4d0 <col:31, col:35> 'int' '<'
       (ImplicitCastExpr 0x174c4a0 <col:31> 'unsigned int' <Unknown>
         (ImplicitCastExpr 0x174c470 <col:31> 'int' <IntegralCast>
           (DeclRefExpr 0x174c3f8 <col:31> 'signed char' ParmVar='v'
0x174c2c0)))
       (IntegerLiteral 0x174c430 <col:35> 'unsigned int' 1))))


Is that meant to be OK?

I am asking because, when looking to dumps from older clang revisions, I
got the (probably false) impression that some effort was done in order
to merge chains of consecutive implicit casts into a single one.

Is it the case that now the two casts are not merged because they have
different kind (one is an IntegralCast, the other is Unknown)?

Thanks in advance for any explanation,
Enea Zaffanella.

_______________________________________________
cfe-dev mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
Reply | Threaded
Open this post in threaded view
|

Re: Nested implicit casts?

Douglas Gregor

On Jan 11, 2010, at 10:58 AM, Enea Zaffanella wrote:

> Hello.
>
> Dumping the AST for the following program:
>
> int f(signed char v) { return v < 1U; }
>
> we obtain an implicit cast expression that (immediately) contains
> another implicit cast expression:
>
> int f(signed char v) (CompoundStmt 0x174c530 <test.c:1:22, col:39>
>   (ReturnStmt 0x174c510 <col:24, col:35>
>     (BinaryOperator 0x174c4d0 <col:31, col:35> 'int' '<'
>       (ImplicitCastExpr 0x174c4a0 <col:31> 'unsigned int' <Unknown>
>         (ImplicitCastExpr 0x174c470 <col:31> 'int' <IntegralCast>
>           (DeclRefExpr 0x174c3f8 <col:31> 'signed char' ParmVar='v'
> 0x174c2c0)))
>       (IntegerLiteral 0x174c430 <col:35> 'unsigned int' 1))))
>
>
> Is that meant to be OK?
>
> I am asking because, when looking to dumps from older clang  
> revisions, I
> got the (probably false) impression that some effort was done in order
> to merge chains of consecutive implicit casts into a single one.

When those conversions are conceptually the same kind of conversion,  
we do want to merge the two implicit casts into a single implicit cast.

> Is it the case that now the two casts are not merged because they have
> different kind (one is an IntegralCast, the other is Unknown)?


Yes, although we'd really like to fix that outer cast so that it is  
not of type 'Unknown'. The unknown cast kind is meant to go away.

        - Doug
_______________________________________________
cfe-dev mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
Reply | Threaded
Open this post in threaded view
|

Re: Nested implicit casts?

Eli Friedman
In reply to this post by Enea Zaffanella
On Mon, Jan 11, 2010 at 10:58 AM, Enea Zaffanella
<[hidden email]> wrote:

> Hello.
>
> Dumping the AST for the following program:
>
> int f(signed char v) { return v < 1U; }
>
> we obtain an implicit cast expression that (immediately) contains
> another implicit cast expression:
>
> int f(signed char v) (CompoundStmt 0x174c530 <test.c:1:22, col:39>
>   (ReturnStmt 0x174c510 <col:24, col:35>
>     (BinaryOperator 0x174c4d0 <col:31, col:35> 'int' '<'
>       (ImplicitCastExpr 0x174c4a0 <col:31> 'unsigned int' <Unknown>
>         (ImplicitCastExpr 0x174c470 <col:31> 'int' <IntegralCast>
>           (DeclRefExpr 0x174c3f8 <col:31> 'signed char' ParmVar='v'
> 0x174c2c0)))
>       (IntegerLiteral 0x174c430 <col:35> 'unsigned int' 1))))
>
>
> Is that meant to be OK?
>
> I am asking because, when looking to dumps from older clang revisions, I
> got the (probably false) impression that some effort was done in order
> to merge chains of consecutive implicit casts into a single one.
>
> Is it the case that now the two casts are not merged because they have
> different kind (one is an IntegralCast, the other is Unknown)?

Yes, precisely, although that's actually a bug in this case (both
casts should be of type IntegralCast).

-Eli

_______________________________________________
cfe-dev mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
Reply | Threaded
Open this post in threaded view
|

Re: Nested implicit casts?

Sebastian Redl
In reply to this post by Enea Zaffanella
Enea Zaffanella wrote:

> Hello.
>
> Dumping the AST for the following program:
>
> int f(signed char v) { return v < 1U; }
>
> we obtain an implicit cast expression that (immediately) contains
> another implicit cast expression:
>
> int f(signed char v) (CompoundStmt 0x174c530 <test.c:1:22, col:39>
>    (ReturnStmt 0x174c510 <col:24, col:35>
>      (BinaryOperator 0x174c4d0 <col:31, col:35> 'int' '<'
>        (ImplicitCastExpr 0x174c4a0 <col:31> 'unsigned int' <Unknown>
>          (ImplicitCastExpr 0x174c470 <col:31> 'int' <IntegralCast>
>            (DeclRefExpr 0x174c3f8 <col:31> 'signed char' ParmVar='v'
> 0x174c2c0)))
>        (IntegerLiteral 0x174c430 <col:35> 'unsigned int' 1))))
>
>
> Is that meant to be OK?
>  
No, unknown casts should never appear in the AST in the first place;
they're a transitional construct.

Sebastian
_______________________________________________
cfe-dev mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev