Changeset 78cdb06


Ignore:
Timestamp:
Nov 29, 2019, 1:47:14 PM (5 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
0f9ceacb, ce7bdc4, e71c1d4
Parents:
397c101a
Message:

Modified Lvalue cast handling to ignore top level dereferencing in AsmExpr?, also added test case for this fixes #152?

Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/Lvalue.cc

    r397c101a r78cdb06  
    6060                }
    6161
    62                 struct ReferenceConversions final : public WithStmtsToAdd {
     62                struct ReferenceConversions final : public WithStmtsToAdd, public WithGuards {
    6363                        Expression * postmutate( CastExpr * castExpr );
    6464                        Expression * postmutate( AddressExpr * addrExpr );
     
    7171
    7272                struct FixIntrinsicResult final : public WithGuards {
     73                        enum {
     74                                NoSkip,
     75                                Skip,
     76                                SkipInProgress
     77                        } skip = NoSkip;
     78
     79                        void premutate( AsmExpr * ) { GuardValue( skip ); skip = Skip; }
     80                        void premutate( ApplicationExpr * ) { GuardValue( skip ); skip = (skip == Skip) ? SkipInProgress : NoSkip; }
     81
     82
    7383                        Expression * postmutate( ApplicationExpr * appExpr );
    7484                        void premutate( FunctionDecl * funcDecl );
     
    162172
    163173                Expression * FixIntrinsicResult::postmutate( ApplicationExpr * appExpr ) {
    164                         if ( isIntrinsicReference( appExpr ) ) {
     174                        if ( skip != SkipInProgress && isIntrinsicReference( appExpr ) ) {
    165175                                // eliminate reference types from intrinsic applications - now they return lvalues
    166176                                ReferenceType * result = strict_dynamic_cast< ReferenceType * >( appExpr->result );
  • tests/.expect/references.txt

    r397c101a r78cdb06  
    36363
    37373 9 { 1., 7. }, [1, 2, 3]
     384
    3839Destructing a Y
    3940Destructing a Y
  • tests/references.cfa

    r397c101a r78cdb06  
    119119                f( 3, a + b, (S){ 1.0, 7.0 }, (int [3]){ 1, 2, 3 } ); // two rvalue to reference
    120120        }
     121
     122        {
     123                int a = 3;
     124                int *p = &a;
     125                asm (
     126                        "incl %[p]\n\t" :
     127                        : [p] "m" (*p)
     128                );
     129                printf("%d\n", a);
     130        }
    121131}
    122132
Note: See TracChangeset for help on using the changeset viewer.