diff --git a/src/dmd/backend/elfobj.d b/src/dmd/backend/elfobj.d index 157b7ffa979b..d0975ad07b77 100644 --- a/src/dmd/backend/elfobj.d +++ b/src/dmd/backend/elfobj.d @@ -1959,9 +1959,12 @@ private int elf_addsegment2(IDXSEC shtidx, IDXSYM symidx, IDXSEC relidx) } assert(seg_count < seg_max); if (!SegData[seg]) - { SegData[seg] = cast(seg_data *)mem_calloc((seg_data).sizeof); + { + SegData[seg] = cast(seg_data *)mem_calloc(seg_data.sizeof); //printf("test2: SegData[%d] = %p\n", seg, SegData[seg]); } + else + memset(SegData[seg], 0, seg_data.sizeof); seg_data *pseg = SegData[seg]; pseg.SDseg = seg; diff --git a/src/dmd/semantic3.d b/src/dmd/semantic3.d index 6f722e947f19..06800e21cfa0 100644 --- a/src/dmd/semantic3.d +++ b/src/dmd/semantic3.d @@ -529,7 +529,7 @@ private extern(C++) final class Semantic3Visitor : Visitor if (auto s = funcdecl.fensure.isScopeStatement()) fensure_endlin = s.endloc.linnum; - if ((needEnsure && global.params.useOut) || fpostinv) + if ((needEnsure && global.params.useOut == CHECKENABLE.on) || fpostinv) { funcdecl.returnLabel = new LabelDsymbol(Id.returnLabel); } @@ -903,7 +903,7 @@ private extern(C++) final class Semantic3Visitor : Visitor sc2 = sc2.pop(); - if (!global.params.useIn) + if (global.params.useIn == CHECKENABLE.off) freq = null; } if (fens) @@ -937,7 +937,7 @@ private extern(C++) final class Semantic3Visitor : Visitor sc2 = sc2.pop(); - if (!global.params.useOut) + if (global.params.useOut == CHECKENABLE.off) fens = null; } if (funcdecl.fbody && funcdecl.fbody.isErrorStatement()) diff --git a/test/runnable/extra-files/lib18456b.d b/test/runnable/extra-files/lib18456b.d new file mode 100644 index 000000000000..714d8cf9a616 --- /dev/null +++ b/test/runnable/extra-files/lib18456b.d @@ -0,0 +1,12 @@ +module manual; + +class ManualGC { + void enable() + { + } + + void disable() + { + } + +} diff --git a/test/runnable/test16096.sh b/test/runnable/test16096.sh index 77fe08767e96..697cc439dd15 100755 --- a/test/runnable/test16096.sh +++ b/test/runnable/test16096.sh @@ -6,7 +6,7 @@ if [ "$OS" != 'osx' ] || [ "$MODEL" != '64' ]; then fi $DMD -I${EXTRA_FILES} -of${OUTPUT_BASE}${LIBEXT} -lib ${EXTRA_FILES}/test16096a.d -$DMD -I${EXTRA_FILES} -of${OUTPUT_BASE}${EXT} ${EXTRA_FILES}/test16096.d ${OUTPUT_BASE}${LIBEXT} -L-framework -LFoundation +$DMD -I${EXTRA_FILES} -of${OUTPUT_BASE}${EXE} ${EXTRA_FILES}/test16096.d ${OUTPUT_BASE}${LIBEXT} -L-framework -LFoundation ${OUTPUT_BASE}${EXE} rm ${OUTPUT_BASE}{${LIBEXT},${EXE}} diff --git a/test/runnable/test18456.sh b/test/runnable/test18456.sh index 9f4e8bba0ecd..eeaae0d96a4f 100644 --- a/test/runnable/test18456.sh +++ b/test/runnable/test18456.sh @@ -1,6 +1,7 @@ #!/usr/bin/env bash -$DMD -m${MODEL} -I${EXTRA_FILES} -of${OUTPUT_BASE}${LIBEXT} -lib ${EXTRA_FILES}/lib18456.d +# source file order is important +$DMD -m${MODEL} -I${EXTRA_FILES} -of${OUTPUT_BASE}${LIBEXT} -lib ${EXTRA_FILES}/lib18456b.d ${EXTRA_FILES}/lib18456.d $DMD -m${MODEL} -I${EXTRA_FILES} -of${OUTPUT_BASE}${EXE} ${EXTRA_FILES}/test18456.d ${OUTPUT_BASE}${LIBEXT} ${OUTPUT_BASE}${EXE} diff --git a/test/runnable/test_dip1006.d b/test/runnable/test_dip1006.d new file mode 100644 index 000000000000..d8a8b4bccc93 --- /dev/null +++ b/test/runnable/test_dip1006.d @@ -0,0 +1,38 @@ +// REQUIRED_ARGS: -check=in=off -check=out=off -check=invariant=off +// PERMUTE_ARGS: +class C +{ + int foo(int a) + in { assert(a != 0); } // skipped + out(res) { assert(res != 0); } // skipped + body + { + return a; + } + + invariant // skipped + { + assert(false); + } + + void bar(int a) + { + assert(a != 0); // triggered + } +} + +void main() +{ + import core.exception : AssertError; + + auto c = new C; + c.foo(0); + + bool catched; + try + c.bar(0); + catch (AssertError e) + catched = true; + if (!catched) + assert(0); +} diff --git a/test/runnable/test_dip1006b.d b/test/runnable/test_dip1006b.d new file mode 100644 index 000000000000..e64efbacac4d --- /dev/null +++ b/test/runnable/test_dip1006b.d @@ -0,0 +1,35 @@ +// REQUIRED_ARGS: -check=in=off -check=invariant=off +// PERMUTE_ARGS: +class C +{ + int foo(int a) + in { assert(a != 0); } // skipped + out(res) { assert(res != 0, "out"); } // triggered + body + { + return a; + } + + invariant // skipped + { + assert(false); + } +} + +void main() +{ + import core.exception : AssertError; + + auto c = new C; + bool catched; + try + c.foo(0); + catch (AssertError e) + { + assert(e.msg == "out"); + catched = e.msg == "out"; + } + + if (!catched) + assert(0); +}