diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/EliminateGenerics.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/EliminateGenerics.java index fdb18a317..089c22ee6 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/EliminateGenerics.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/EliminateGenerics.java @@ -582,12 +582,12 @@ public void visit(ImTypeArgument ta) { @Override public void visit(ImNull e) { ImType newT = transformType(e.getType(), generics, typeVars); - newT = specializeType(newT); e.setType(newT); ImExpr safe = specializeNullInitializer(e, newT); if (safe != e) { e.replaceBy(safe); + return; } super.visit(e); } diff --git a/de.peeeq.wurstscript/src/test/java/tests/wurstscript/tests/GenericsWithTypeclassesTests.java b/de.peeeq.wurstscript/src/test/java/tests/wurstscript/tests/GenericsWithTypeclassesTests.java index ed0ebf60b..c7bcd8a57 100644 --- a/de.peeeq.wurstscript/src/test/java/tests/wurstscript/tests/GenericsWithTypeclassesTests.java +++ b/de.peeeq.wurstscript/src/test/java/tests/wurstscript/tests/GenericsWithTypeclassesTests.java @@ -2023,5 +2023,35 @@ public void fullArrayListTest() throws IOException { testAssertOkFileWithStdLib(new File(TEST_DIR + "arrayList.wurst"), true); } + @Test + public void genericNullComparison() { + testAssertOkLinesWithStdLib(true, + "package test", + "import NoWurst", + "import ClosureTimers", + "native testSuccess()", + "public class Reference", + " T val", + " construct(T val)", + " this.val = val", + " function into() returns T", + " let rval = val", + " destroy this", + " return rval", + "", + "var r = new Reference(0.0)", + "", + "init", + " // force member access on the global", + " doAfter(.1) ->", + " r.val = 1.0", + " if r != null and not r == null and r.into() == 1.0", + " testSuccess()", + " testSuccess() // to make compiler happy", + "endpackage" + ); + } + + }