Opened 18 months ago

#259 new defect

Compiler crash on large recursive assertion requests

Reported by: mlbrooks Owned by:
Priority: major Component: cfa-cc
Version: 1.0 Keywords:
Cc:

Description

This bug report is the closest we have to a reproduction of intermittent failures seen in the array-md-sbscr-cases test.

That test, as written 2022-April-09, fails intermittently on 32-bit overnight builds, cannot be made to fail manually (even on 32-bit), and succeeds on 64-bit.

The case in here fails deterministically when run manually on 32-bit and succeeds on 64-bit. It fails with the same symptom as in the failed overnight build logs.

The case in here is edited substantially, to remove unnecessary features of array.hfa and all but a minimal repro based on the array-md-sbscr-cases test.

forall( __CFA_tysys_id_only_X & ) struct tag {};


forall( [N], S &, Timmed &, Tbase & ) {
    struct thing {};

    // get1, first alternative (int overload)
    Timmed & get1( thing(N, S, Timmed, Tbase) & a, int i );
}


forall( TA &, TB &, TC &, IxAB_0, IxBC | { TB & get1( TA &, IxAB_0 ); TC & get1( TB &, IxBC ); } )
TC & get2( TA & this, IxAB_0 ab, IxBC bc );

forall( TA &, TB &, TC &, IxAB_0, IxAB_1, IxBC | { TB & get2( TA &, IxAB_0, IxAB_1 ); TC & get1( TB &, IxBC ); } )
TC & get3( TA & this, IxAB_0 ab0, IxAB_1 ab1, IxBC bc );

forall( TA &, TB &, TC &, IxAB_0, IxAB_1, IxAB_2, IxBC | { TB & get3( TA &, IxAB_0, IxAB_1, IxAB_2 ); TC & get1( TB &, IxBC ); } )
TC & get4( TA & this, IxAB_0 ab0, IxAB_1 ab1, IxAB_2 ab2, IxBC bc );


// Base
forall( [Nq], Sq &, Tbase & )
tag(thing(Nq, Sq, Tbase, Tbase)) enq_( tag(Tbase), tag(Nq), tag(Sq), tag(Tbase) );

// Rec
forall( [Nq], Sq &, [N], S &, recq &, recr &, Tbase & | { tag(recr) enq_( tag(Tbase), tag(Nq), tag(Sq), tag(recq) ); } )
tag(thing(N, S, recr, Tbase)) enq_( tag(Tbase), tag(Nq), tag(Sq), tag(thing(N, S, recq, Tbase)) );

struct all_t {} all;

// get1, second alternative ("all" overload)
forall( [N], S &, Te &, result &, Tbase & | { tag(result) enq_( tag(Tbase), tag(N), tag(S), tag(Te) ); } )
result & get1( thing(N, S, Te, Tbase) & this, all_t );


void test() {

    thing(5, char, thing(6, char, thing(7, char, thing(8, char, float, float), float), float), float) wxyz;

    float ans1 = get1( get4( wxyz, all, 3, 4,   5 ), 2 );  // works everywhere
    float ans2 = get1( get4( wxyz, 2,   3, all, 5 ), 4 );  // crashes on 32bit, works on 64bit

    float ans3 = get1( get1( get1( get1( get1( wxyz, 2 ), 3), all), 5 ), 4 );  // works everywhere (is the intended expansion of get4 from ans2)
}

cfa -c thistest.cfa

32-bit, as-is, actual: compiler error, with message beginning

CFA Version 1.0.0 (debug)
*CFA assertion error* "inferParam != appExpr->inferParams.end()" from program "cfa-cpp" in "void GenPoly::{anonymous}::Pass1::addInferredParams(ApplicationExpr*, FunctionType*, std::__cxx11::list<Expression*>::iterator&, const TyVarMap&)" at line 801 in file "../../cfa-cc/src/GenPoly/Box.cc": addInferredParams missing inferred parameter: enq_: extern pointer to function

32-bit, as-is, expected;
32-bit, edited to remove the "crashes" line, actual and expected;
64-bit, as-is, actual and expected:
compilation finishes and produces a *.o file

Change History (0)

Note: See TracTickets for help on using tickets.