Changeset 13846


Ignore:
Timestamp:
Oct 25, 2019 8:28:45 AM (3 weeks ago)
Author:
Jonathan Kämpe
Message:

#5862 Merge to trunk. Fixed bug where empty array subscripts added during scalarization lead to c-compilation error.

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/CHANGELOG.txt

    r13719 r13846  
    11================= Unreleased ==================
     2# Fixed ; Minor ; Compiler ; #5862
     3Fixed bug where empty array subscripts added during scalarization lead to c-compilation error.
     4
    25# Feature ; Minor ; Compiler; #5837
    36Added a pre-compiled evaluator used for evaluating external functions
  • trunk/Compiler/ModelicaCBackEnd/test/modelica/CCodeGenArrayTests.mo

    r12857 r13846  
    941941end RecordArray13;
    942942
     943model RecordArray14
     944    record R
     945        Real x = 1;
     946    end R;
     947   
     948    function f
     949        input Integer n;
     950        Real[n] xs;
     951        R[n] rs;
     952        output Real y;
     953    algorithm
     954        xs := rs.x;
     955        y := sum(xs);
     956        annotation(Inline=false);
     957    end f;
     958
     959    Real y = f(integer(time));
     960   
     961annotation(__JModelica(UnitTesting(tests={
     962    CCodeGenTestCase(
     963        name="RecordArray14",
     964        description="Test for bug in #5862",
     965        template="$C_functions$",
     966        generatedCode="
     967void func_CCodeGenArrayTests_RecordArray14_f_def0(jmi_real_t n_v, jmi_real_t* y_o) {
     968    JMI_DYNAMIC_INIT()
     969    JMI_ARR(HEAP, jmi_real_t, jmi_array_t, xs_a, -1, 1)
     970    JMI_ARR(HEAP, R_0_r, R_0_ra, rs_a, -1, 1)
     971    JMI_DEF(REA, tmp_1)
     972    JMI_DEF(REA, tmp_1_max)
     973    JMI_DEF(REA, y_v)
     974    JMI_DEF(REA, temp_1_v)
     975    jmi_real_t i1_0i;
     976    jmi_int_t i1_0ie;
     977    jmi_int_t i1_0in;
     978    jmi_real_t i1_1i;
     979    jmi_int_t i1_1ie;
     980    jmi_int_t i1_1in;
     981    jmi_real_t i1_2i;
     982    jmi_int_t i1_2ie;
     983    jmi_int_t i1_2in;
     984    JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, xs_a, n_v, 1, n_v)
     985    JMI_ARRAY_INIT_1(HEAP, R_0_r, R_0_ra, rs_a, n_v, 1, n_v)
     986    tmp_1_max = n_v + 1;
     987    for (tmp_1 = 1; tmp_1 < tmp_1_max; tmp_1++) {
     988    }
     989    i1_0in = 0;
     990    i1_0ie = floor((n_v) - (1));
     991    for (i1_0i = 1; i1_0in <= i1_0ie; i1_0i = 1 + (++i1_0in)) {
     992        jmi_array_rec_1(rs_a, i1_0i)->x = 1;
     993    }
     994    i1_1in = 0;
     995    i1_1ie = floor((n_v) - (1));
     996    for (i1_1i = 1; i1_1in <= i1_1ie; i1_1i = 1 + (++i1_1in)) {
     997        jmi_array_ref_1(xs_a, i1_1i) = jmi_array_rec_1(rs_a, i1_1i)->x;
     998    }
     999    temp_1_v = 0.0;
     1000    i1_2in = 0;
     1001    i1_2ie = floor((n_v) - (1));
     1002    for (i1_2i = 1; i1_2in <= i1_2ie; i1_2i = 1 + (++i1_2in)) {
     1003        temp_1_v = temp_1_v + jmi_array_val_1(xs_a, i1_2i);
     1004    }
     1005    y_v = temp_1_v;
     1006    JMI_RET(GEN, y_o, y_v)
     1007    JMI_DYNAMIC_FREE()
     1008    return;
     1009}
     1010
     1011jmi_real_t func_CCodeGenArrayTests_RecordArray14_f_exp0(jmi_real_t n_v) {
     1012    JMI_DEF(REA, y_v)
     1013    func_CCodeGenArrayTests_RecordArray14_f_def0(n_v, &y_v);
     1014    return y_v;
     1015}
     1016")})));
     1017end RecordArray14;
     1018
    9431019end CCodeGenArrayTests;
  • trunk/Compiler/ModelicaFlatTree/src/jastadd/PrettyPrint.jrag

    r13586 r13846  
    14061406   
    14071407    public void FArraySubscripts.prettyPrint(Printer p, CodeStream str, String indent) {
    1408         if (numSubscript()>0) {
    1409             str.print("[");
    1410             for (int i=0;i<numSubscript();i++) {
    1411                 subscript(i).prettyPrint(p, str, indent);
    1412                 if (i<numSubscript()-1)
    1413                     str.print(",");
    1414             }
    1415             str.print("]");
    1416         }
     1408        str.print("[");
     1409        for (int i = 0; i < numSubscript(); i++) {
     1410            subscript(i).prettyPrint(p, str, indent);
     1411            if (i < numSubscript() - 1) {
     1412                str.print(",");
     1413            }
     1414        }
     1415        str.print("]");
    14171416    }
    14181417
  • trunk/Compiler/ModelicaMiddleEnd/src/jastadd/scalarization/Scalarization.jrag

    r13357 r13846  
    912912
    913913    public FTempAccessExp FExp.tempExp(String name, Index i) {
    914         FTempAccessExp res;
     914        FAccess access;
    915915        if (inFunction()) {
    916             res = new FTempAccessExp(new FAccessFull(name, i.createFArraySubscripts()));
     916            access = new FAccessFull(name, i.createFArraySubscripts());
    917917        } else {
    918             res = new FTempAccessExp(new FAccessString(name + i));
    919         }
    920         return (FTempAccessExp) dynamicFExp(res);
     918            access = new FAccessString(name + i);
     919        }
     920        return (FTempAccessExp) dynamicFExp(new FTempAccessExp(access));
    921921    }
    922922
    923923    public FTempAccessExp FExp.tempExp(String name, FArraySubscripts fas) {
    924         FTempAccessExp res;
     924        FAccess access;
    925925        if (inFunction()) {
    926             res = new FTempAccessExp(new FAccessFull(name, fas));
     926            if (fas == null) {
     927                access = new FAccessFull(name);
     928            } else {
     929                access = new FAccessFull(name, fas);
     930            }
    927931        } else {
    928932            if (fas == null) {
    929                 res = new FTempAccessExp(new FAccessString(name));
     933                access = new FAccessString(name);
    930934            } else {
    931                 res = new FTempAccessExp(new FAccessString(name + fas));
    932             }
    933         }
    934         return (FTempAccessExp) dynamicFExp(res);
     935                access = new FAccessString(name + fas);
     936            }
     937        }
     938        return (FTempAccessExp) dynamicFExp(new FTempAccessExp(access));
    935939    }
    936940
  • trunk/Compiler/ModelicaMiddleEnd/src/jastadd/scalarization/ScalarizeFunctions.jrag

    r12716 r13846  
    497497                List<FSubscript> subs = new List<FSubscript>();
    498498                subs.add(new FIntegerSubscript(i+1));
    499                 subs.addAll(names.createFArraySubscripts().copyAsFArrayExpSubscripts().getFSubscriptListNoTransform());
     499                if (names.hasNames()) {
     500                    subs.addAll(names.createFArraySubscripts().copyAsFArrayExpSubscripts().getFSubscriptListNoTransform());
     501                }
    500502                left = tempExp(new FArrayExpSubscripts(subs));
    501503                right.createArrayTemporaries(s);
     
    916918   
    917919    public void FAccessExp.addArrayUsesToIndexMap(Scalarizer s, FExp[] names) {
    918         if (!hasFArraySubscripts() && isArray())
     920        if (!hasFArraySubscripts() && myFV().isArray()) {
    919921            indexNames = names;
     922        }
    920923        super.addArrayUsesToIndexMap(s, names);
    921924    }
     
    12121215         * Creates a new FArraySubscripts with uses of the <code>d1</code> to <code>d2</code> names
    12131216         * in the top layer as subscripts. When out of names, adds 1s.
     1217         *
     1218         * Returns null if d1 == d2.
    12141219         */
    12151220        public FArrayExpSubscripts createFArraySubscripts(int d1, int d2) {
    1216             if (d1 < 0)
    1217                 throw new UnsupportedOperationException();
     1221            if (d1 == d2) {
     1222                return null;
     1223            }
    12181224            FArrayExpSubscripts fas = new FArrayExpSubscripts();
    12191225            for (int i = d1; i < d2; ++i) {
    1220                 if (i < topLayer().length)
     1226                if (i < topLayer().length) {
    12211227                    fas.addFSubscript(new FExpSubscript(new FTempAccessExp(new FAccessFull(topLayer()[i]))));
    1222                 else
     1228                } else {
    12231229                    fas.addFSubscript(new FIntegerSubscript(1));
     1230                }
    12241231            }
    12251232            return fas;
     
    12291236         * Creates a new FArraySubscripts with uses of the <code>d</code>
    12301237         * first names in the top layer as subscripts. When out of names, adds 1s.
     1238         * Returns null if d == 0.
    12311239         */
    12321240        public FArrayExpSubscripts createFArraySubscripts(int d) {
     
    12361244        /**
    12371245         * Creates a new FArraySubscripts with uses of all the names in the top layer.
     1246         * Returns null if no names available.
    12381247         */
    12391248        public FArrayExpSubscripts createFArraySubscripts() {
Note: See TracChangeset for help on using the changeset viewer.