Commit d2025512 by Iain Buclaw

re PR d/88990 (ICE in get_symbol_decl, at d/decl.cc:1097)

    PR d/88990
d/dmd: Merge upstream dmd 8d4c876c6

The extern storage class flag was wrongly propagated to function scope
when starting the semantic pass on the body.

Fixes https://gcc.gnu.org/PR88990

Reviewed-on: https://github.com/dlang/dmd/pull/9452

From-SVN: r269708
parent ec156546
19b1454b5ca7b1036ea5fde197d91d4a7d05c0a5 8d4c876c658608e8f6e653803c534a9e15618f57
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the dlang/dmd repository. merge done from the dlang/dmd repository.
...@@ -2008,6 +2008,7 @@ bool VarDeclaration::isDataseg() ...@@ -2008,6 +2008,7 @@ bool VarDeclaration::isDataseg()
else if (storage_class & (STCstatic | STCextern | STCtls | STCgshared) || else if (storage_class & (STCstatic | STCextern | STCtls | STCgshared) ||
parent->isModule() || parent->isTemplateInstance() || parent->isNspace()) parent->isModule() || parent->isTemplateInstance() || parent->isNspace())
{ {
assert(!isParameter() && !isResult());
isdataseg = 1; // It is in the DataSegment isdataseg = 1; // It is in the DataSegment
} }
} }
......
...@@ -1437,7 +1437,7 @@ void FuncDeclaration::semantic3(Scope *sc) ...@@ -1437,7 +1437,7 @@ void FuncDeclaration::semantic3(Scope *sc)
sc2->sw = NULL; sc2->sw = NULL;
sc2->fes = fes; sc2->fes = fes;
sc2->linkage = LINKd; sc2->linkage = LINKd;
sc2->stc &= ~(STCauto | STCscope | STCstatic | STCabstract | sc2->stc &= ~(STCauto | STCscope | STCstatic | STCextern | STCabstract |
STCdeprecated | STCoverride | STCdeprecated | STCoverride |
STC_TYPECTOR | STCfinal | STCtls | STCgshared | STCref | STCreturn | STC_TYPECTOR | STCfinal | STCtls | STCgshared | STCref | STCreturn |
STCproperty | STCnothrow | STCpure | STCsafe | STCtrusted | STCsystem); STCproperty | STCnothrow | STCpure | STCsafe | STCtrusted | STCsystem);
......
// https://issues.dlang.org/show_bug.cgi?id=19734
// REQUIRED_ARGS: -main
class C19734
{
import core.stdc.stdarg;
extern
{
// Invalid 'this' parameter because of applied 'extern' storage class.
void testin(typeof(this) p)
in { assert(this is p); }
body
{
}
// Undefined reference to __result.
int testout()
out { assert(__result == 2); }
body
{
return 2;
}
// Undefined reference to var.
int testlocal()
{
int var;
return var + 2;
}
// Variable _argptr cannot have initializer.
int testvarargs(...)
{
return 0;
}
}
}
// https://issues.dlang.org/show_bug.cgi?id=19735
extern int test1(int par)
{
int var = 42;
return var + par;
}
extern
{
int test2(int par)
{
int var = 42;
return var + par;
}
}
void main()
{
assert(test1(1) == test2(1));
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment