aboutsummaryrefslogtreecommitdiff
path: root/gcc/d/dmd/declaration.c
diff options
context:
space:
mode:
authorIain Buclaw <ibuclaw@gdcproject.org>2021-01-25 13:50:55 +0100
committerIain Buclaw <ibuclaw@gdcproject.org>2021-01-26 09:54:57 +0100
commit5a36cae275ad84cc7e623f2f5829bdad767e3f6a (patch)
treece6b996b6cfcb1b1aa73bcc7786c07ef8df504b1 /gcc/d/dmd/declaration.c
parenteb77a934eec8fe52e4c5612f5264127290bc517d (diff)
downloadgcc-5a36cae275ad84cc7e623f2f5829bdad767e3f6a.zip
gcc-5a36cae275ad84cc7e623f2f5829bdad767e3f6a.tar.gz
gcc-5a36cae275ad84cc7e623f2f5829bdad767e3f6a.tar.bz2
d: Merge upstream dmd 609c3ce2d, phobos 3dd5df686
D front-end changes: - Contracts for pre- and postconditions are now implicitly "this" const, so that state can no longer be altered in these functions. - Inside a constructor scope, assigning to aggregate declaration members is done by considering the first assignment as initialization and subsequent assignments as modifications of the constructed object. For const/immutable fields the initialization is accepted in the constructor but subsequent modifications are not. However this rule did not apply when inside a constructor scope there is a call to a different constructor. This been changed so it is now an error when there's a double initialization of immutable fields inside a constructor. Phobos changes: - Don't run unit-tests for unsupported clocks in std.datetime. The phobos and phobos_shared tests now add -fversion=Linux_Pre_2639 if required. - Deprecate public extern(C) bindings for getline and getdelim in std.stdio. The correct module for bindings is core.sys.posix.stdio. Reviewed-on: https://github.com/dlang/dmd/pull/12153 https://github.com/dlang/phobos/pull/7768 gcc/d/ChangeLog: * dmd/MERGE: Merge upstream dmd 609c3ce2d. * d-compiler.cc (Compiler::loadModule): Rename to ... (Compiler::onParseModule): ... this. (Compiler::onImport): New function. * d-lang.cc (d_parse_file): Remove call to Compiler::loadModule. libphobos/ChangeLog: * src/MERGE: Merge upstream phobos 3dd5df686. * testsuite/libphobos.phobos/phobos.exp: Add compiler flag -fversion=Linux_Pre_2639 if target is linux_pre_2639. * testsuite/libphobos.phobos_shared/phobos_shared.exp: Likewise.
Diffstat (limited to 'gcc/d/dmd/declaration.c')
-rw-r--r--gcc/d/dmd/declaration.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/gcc/d/dmd/declaration.c b/gcc/d/dmd/declaration.c
index 72a07d9b8..d20f663 100644
--- a/gcc/d/dmd/declaration.c
+++ b/gcc/d/dmd/declaration.c
@@ -145,6 +145,20 @@ int Declaration::checkModify(Loc loc, Scope *sc, Type *, Expression *e1, int fla
}
}
+ if (e1 && e1->op == TOKthis && isField())
+ {
+ VarDeclaration *vthis = e1->isThisExp()->var;
+ for (Scope *scx = sc; scx; scx = scx->enclosing)
+ {
+ if (scx->func == vthis->parent && (scx->flags & SCOPEcontract))
+ {
+ if (!flag)
+ error(loc, "cannot modify parameter `this` in contract");
+ return 2; // do not report type related errors
+ }
+ }
+ }
+
if (v && (isCtorinit() || isField()))
{
// It's only modifiable if inside the right constructor