Bug 3353 – storage class of a member function is propagated to default arguments

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
Other
OS
Windows
Creation time
2009-09-30T13:55:00Z
Last change time
2015-06-09T01:26:48Z
Keywords
patch, rejects-valid
Assigned to
nobody
Creator
r.sagitario

Comments

Comment #0 by r.sagitario — 2009-09-30T13:55:03Z
Compiling the module test.d: public struct foo { public this(real aleft) { } } class bar { final void fun(foo arg = foo(0.)) { } } produces: test.d(11): Error: variable test.bar.__ctmp1 final cannot be applied to variable
Comment #1 by r.sagitario — 2009-09-30T14:00:21Z
This happens, because the default argument is evaluated in the same scope as the function. The following patch opens a new scope for argument semantics, clearing the storage class (maybe some flags should be kept?): Index: mtype.c =================================================================== --- mtype.c (revision 196) +++ mtype.c (working copy) @@ -4065,11 +4065,14 @@ if (tf->parameters) { size_t dim = Argument::dim(tf->parameters); + Scope* argsc = sc->push(); // arguments must be evaluated in a different scope + argsc->stc = STCundefined; // as we don't want to inherit storage class from the function + for (size_t i = 0; i < dim; i++) { Argument *arg = Argument::getNth(tf->parameters, i); tf->inuse++; - arg->type = arg->type->semantic(loc,sc); + arg->type = arg->type->semantic(loc,argsc); if (tf->inuse == 1) tf->inuse--; arg->type = arg->type->addStorageClass(arg->storageClass); @@ -4094,9 +4097,9 @@ if (arg->defaultArg) { - arg->defaultArg = arg->defaultArg->semantic(sc); - arg->defaultArg = resolveProperties(sc, arg->defaultArg); - arg->defaultArg = arg->defaultArg->implicitCastTo(sc, arg->type); + arg->defaultArg = arg->defaultArg->semantic(argsc); + arg->defaultArg = resolveProperties(argsc, arg->defaultArg); + arg->defaultArg = arg->defaultArg->implicitCastTo(argsc, arg->type); } /* If arg turns out to be a tuple, the number of parameters may @@ -4107,6 +4110,7 @@ i--; } } + argsc->pop(); } if (tf->next) tf->deco = tf->merge()->deco;
Comment #2 by bugzilla — 2009-10-06T02:19:18Z
Fixed dmd 1.048 and 2.033