diff --git a/src/dmd/typesem.d b/src/dmd/typesem.d index 76142a94ffa5..6f09a3655396 100644 --- a/src/dmd/typesem.d +++ b/src/dmd/typesem.d @@ -3223,6 +3223,10 @@ private extern(C++) final class DotExpVisitor : Visitor } checkAccess(e.loc, sc, null, v); Expression ve = new VarExp(e.loc, v); + if (!isTrivialExp(e)) + { + ve = new CommaExp(e.loc, e, ve); + } ve = ve.expressionSemantic(sc); result = ve; return; diff --git a/test/runnable/test12486.d b/test/runnable/test12486.d new file mode 100644 index 000000000000..a0a6e2c41523 --- /dev/null +++ b/test/runnable/test12486.d @@ -0,0 +1,18 @@ +module test12486; + +struct S { enum a = 1; } // or `const` but not for all types + +S f(ref int i) +{ + ++i; + return S(); +} + +void main() +{ + int i = 2; + assert(f(i).a == 1); + // ensure that f(i) was actually called, even though + // a is a statically known property of the returned type + assert(i == 3); +}