re PR d/88990 (ICE in get_symbol_decl, at d/decl.cc:1097)
authorIain Buclaw <ibuclaw@gcc.gnu.org>
Fri, 15 Mar 2019 13:37:07 +0000 (13:37 +0000)
committerIain Buclaw <ibuclaw@gcc.gnu.org>
Fri, 15 Mar 2019 13:37:07 +0000 (13:37 +0000)
    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

gcc/d/dmd/MERGE
gcc/d/dmd/declaration.c
gcc/d/dmd/func.c
gcc/testsuite/gdc.test/runnable/test19734.d [new file with mode: 0644]
gcc/testsuite/gdc.test/runnable/test19735.d [new file with mode: 0644]

index 5e4abe6f33fa093462021876f6661f3176718669..230fd12db2bcd099f360772d375c1003cf1e975a 100644 (file)
@@ -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.
index 6372e39f3f6e2a5d1b6baa8a6cc08f516967d79b..835c6aef8311b72663015930f52ac948ed25f6d4 100644 (file)
@@ -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
         }
     }
index 4b7c2233955cdbc3ffdc9a4a551b16a782b194aa..afba82aac7d0ed74f07c49c03ca4e24fcf773500 100644 (file)
@@ -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 (file)
index 0000000..efa7da3
--- /dev/null
@@ -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 (file)
index 0000000..8a1a5e7
--- /dev/null
@@ -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));
+}
+