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
-19b1454b5ca7b1036ea5fde197d91d4a7d05c0a5
+8d4c876c658608e8f6e653803c534a9e15618f57
The first line of this file holds the git revision number of the last
merge done from the dlang/dmd repository.
else if (storage_class & (STCstatic | STCextern | STCtls | STCgshared) ||
parent->isModule() || parent->isTemplateInstance() || parent->isNspace())
{
+ assert(!isParameter() && !isResult());
isdataseg = 1; // It is in the DataSegment
}
}
sc2->sw = NULL;
sc2->fes = fes;
sc2->linkage = LINKd;
- sc2->stc &= ~(STCauto | STCscope | STCstatic | STCabstract |
+ sc2->stc &= ~(STCauto | STCscope | STCstatic | STCextern | STCabstract |
STCdeprecated | STCoverride |
STC_TYPECTOR | STCfinal | STCtls | STCgshared | STCref | STCreturn |
STCproperty | STCnothrow | STCpure | STCsafe | STCtrusted | STCsystem);
--- /dev/null
+// 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;
+ }
+ }
+}
--- /dev/null
+// 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));
+}
+