diff --git a/compiler/src/dmd/declaration.d b/compiler/src/dmd/declaration.d index 5559b93eb201..e6d24715b6ce 100644 --- a/compiler/src/dmd/declaration.d +++ b/compiler/src/dmd/declaration.d @@ -188,6 +188,15 @@ bool modifyFieldVar(Loc loc, Scope* sc, VarDeclaration var, Expression e1) MODtoChars(var.type.mod), var.kind(), var.toChars()); errorSupplemental(loc, "Use `shared static this` instead."); } + else if (fd.isStaticCtorDeclaration() && !fd.isSharedStaticCtorDeclaration() && + var.type.isConst()) + { + // @@@DEPRECATED_2.116@@@ + // Turn this into an error, merging with the branch above + .deprecation(loc, "%s %s `%s` initialization is not allowed in `static this`", + MODtoChars(var.type.mod), var.kind(), var.toChars()); + deprecationSupplemental(loc, "Use `shared static this` instead."); + } return result; } else diff --git a/compiler/src/dmd/mustuse.d b/compiler/src/dmd/mustuse.d index 11cc3b8d6d8c..844f719e0b81 100644 --- a/compiler/src/dmd/mustuse.d +++ b/compiler/src/dmd/mustuse.d @@ -18,11 +18,11 @@ import dmd.identifier; import dmd.location; // Used in isIncrementOrDecrement -private static const StringExp plusPlus, minusMinus; +private const StringExp plusPlus, minusMinus; // Loc.initial cannot be used in static initializers, so // these need a static constructor. -static this() +shared static this() { plusPlus = new StringExp(Loc.initial, "++"); minusMinus = new StringExp(Loc.initial, "--"); diff --git a/compiler/test/fail_compilation/fail4923.d b/compiler/test/fail_compilation/fail4923.d index 3239cff0cf01..836b14ac6745 100644 --- a/compiler/test/fail_compilation/fail4923.d +++ b/compiler/test/fail_compilation/fail4923.d @@ -1,13 +1,17 @@ /* TEST_OUTPUT: --- -fail_compilation/fail4923.d(4): Error: immutable variable `bar` initialization is not allowed in `static this` -fail_compilation/fail4923.d(4): Use `shared static this` instead. +fail_compilation/fail4923.d(5): Error: immutable variable `bar` initialization is not allowed in `static this` +fail_compilation/fail4923.d(5): Use `shared static this` instead. +fail_compilation/fail4923.d(6): Deprecation: const variable `baz` initialization is not allowed in `static this` +fail_compilation/fail4923.d(6): Use `shared static this` instead. --- */ #line 1 immutable int bar; +const int baz; // https://issues.dlang.org/show_bug.cgi?id=24056 static this() { bar = 42; + baz = 43; }