aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/d/dmd/MERGE2
-rw-r--r--gcc/d/dmd/declaration.c1
-rw-r--r--gcc/d/dmd/func.c2
-rw-r--r--gcc/testsuite/gdc.test/runnable/test19734.d38
-rw-r--r--gcc/testsuite/gdc.test/runnable/test19735.d22
5 files changed, 63 insertions, 2 deletions
diff --git a/gcc/d/dmd/MERGE b/gcc/d/dmd/MERGE
index 5e4abe6..230fd12 100644
--- a/gcc/d/dmd/MERGE
+++ b/gcc/d/dmd/MERGE
@@ -1,4 +1,4 @@
-19b1454b5ca7b1036ea5fde197d91d4a7d05c0a5
+8d4c876c658608e8f6e653803c534a9e15618f57
The first line of this file holds the git revision number of the last
merge done from the dlang/dmd repository.
diff --git a/gcc/d/dmd/declaration.c b/gcc/d/dmd/declaration.c
index 6372e39..835c6ae 100644
--- a/gcc/d/dmd/declaration.c
+++ b/gcc/d/dmd/declaration.c
@@ -2008,6 +2008,7 @@ bool VarDeclaration::isDataseg()
else if (storage_class & (STCstatic | STCextern | STCtls | STCgshared) ||
parent->isModule() || parent->isTemplateInstance() || parent->isNspace())
{
+ assert(!isParameter() && !isResult());
isdataseg = 1; // It is in the DataSegment
}
}
diff --git a/gcc/d/dmd/func.c b/gcc/d/dmd/func.c
index 4b7c223..afba82a 100644
--- a/gcc/d/dmd/func.c
+++ b/gcc/d/dmd/func.c
@@ -1437,7 +1437,7 @@ void FuncDeclaration::semantic3(Scope *sc)
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);
diff --git a/gcc/testsuite/gdc.test/runnable/test19734.d b/gcc/testsuite/gdc.test/runnable/test19734.d
new file mode 100644
index 0000000..efa7da3
--- /dev/null
+++ b/gcc/testsuite/gdc.test/runnable/test19734.d
@@ -0,0 +1,38 @@
+// 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;
+ }
+ }
+}
diff --git a/gcc/testsuite/gdc.test/runnable/test19735.d b/gcc/testsuite/gdc.test/runnable/test19735.d
new file mode 100644
index 0000000..8a1a5e7
--- /dev/null
+++ b/gcc/testsuite/gdc.test/runnable/test19735.d
@@ -0,0 +1,22 @@
+// 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));
+}
+