Fix lifetime opt dropping

This commit is contained in:
Wilson Snyder 2019-07-05 20:09:56 -04:00
parent 8612ba2b8d
commit a4b9745e6e
2 changed files with 18 additions and 4 deletions

View File

@ -304,6 +304,7 @@ private:
AstVarScope* vscp = nodep->varScopep();
if (!vscp) nodep->v3fatalSrc("Scope not assigned");
if (nodep->lvalue()) {
m_sideEffect = true; // $sscanf etc may have RHS vars that are lvalues
m_lifep->complexAssign(vscp);
} else {
m_lifep->varUsageReplace(vscp, nodep); VL_DANGLING(nodep);

View File

@ -6,6 +6,8 @@
`include "verilated.v"
`define STRINGIFY(x) `"x`"
`define ratio_error(a,b) (((a)>(b) ? ((a)-(b)) : ((b)-(a))) /(a))
`define checkr(gotv,expv) do if (`ratio_error((gotv),(expv))>0.0001) begin $write("%%Error: %s:%0d: got=%g exp=%g\n", `__FILE__,`__LINE__, (gotv), (expv)); $stop; end while(0);
module t;
integer file;
@ -113,12 +115,12 @@ module t;
if (chars != 1) $stop;
if (letterq != "ijklmnop") $stop;
chars = $sscanf("xa=1f xb=12898971238912389712783490823_237904689_02348923",
chars = $sscanf("xa=1f xb=12898971238912389712783490823_abcdef689_02348923",
"xa=%x xb=%x", letterq, letterw);
if (`verbose) $write("c=%0d xa=%x xb=%x\n", chars, letterq, letterw);
if (chars != 2) $stop;
if (letterq != 64'h1f) $stop;
if (letterw != 128'h38971278349082323790468902348923) $stop;
if (letterw != 128'h389712783490823_abcdef689_02348923) $stop;
chars = $sscanf("ba=10 bb=110100101010010101012 note_the_two ",
"ba=%b bb=%b%s", letterq, letterw, letterz);
@ -139,14 +141,25 @@ module t;
"r=%g d=%d", r, letterq);
if (`verbose) $write("c=%0d d=%d\n", chars, letterq);
if (chars != 2) $stop;
if (r != 0.1) $stop;
`checkr(r, 0.1);
if (letterq != 64'hfffffffffffc65a5) $stop;
// Cover quad and %e/%f
chars = $sscanf("r=0.2",
"r=%e", r);
if (`verbose) $write("c=%0d r=%e\n", chars, r);
`checkr(r, 0.2);
chars = $sscanf("r=0.3",
"r=%f", r);
if (`verbose) $write("c=%0d r=%f\n", chars, r);
`checkr(r, 0.3);
s = "r=0.2 d=-236124";
chars = $sscanf(s, "r=%g d=%d", r, letterq);
if (`verbose) $write("c=%0d d=%d\n", chars, letterq);
if (chars != 2) $stop;
if (r != 0.2) $stop;
`checkr(r, 0.2);
if (letterq != 64'hfffffffffffc65a4) $stop;
// $fscanf