d: Fix internal compiler error: in add_expr, at tree.c:7794
authorIain Buclaw <ibuclaw@gdcproject.org>
Sat, 10 Aug 2019 14:11:49 +0000 (14:11 +0000)
committerIain Buclaw <ibuclaw@gcc.gnu.org>
Sat, 10 Aug 2019 14:11:49 +0000 (14:11 +0000)
gcc/d/ChangeLog:

PR d/91238
* d-codegen.cc (build_address): If taking the address of a CALL_EXPR,
wrap it in a TARGET_EXPR.

gcc/testsuite/ChangeLog:

PR d/91238
* gdc.dg/pr91238.d: New test.

From-SVN: r274253

gcc/d/ChangeLog
gcc/d/d-codegen.cc
gcc/testsuite/ChangeLog
gcc/testsuite/gdc.dg/pr91238.d [new file with mode: 0644]

index b2a94ea033a0b612f76490e157216cd729d35dc0..04eaccf3fed52af6ae81da927c1d701199147e85 100644 (file)
@@ -1,3 +1,9 @@
+2019-08-10  Iain Buclaw  <ibuclaw@gdcproject.org>
+
+       PR d/91238
+       * d-codegen.cc (build_address): If taking the address of a CALL_EXPR,
+       wrap it in a TARGET_EXPR.
+
 2019-08-10  Iain Buclaw  <ibuclaw@gdcproject.org>
 
        PR d/90893
index 1971064e334330368855758d865000b9747821b4..cf50693b2f5c983f2b90d66a6d8f518ea7e41d7a 100644 (file)
@@ -651,9 +651,11 @@ build_address (tree exp)
   if (TREE_CODE (exp) == CONST_DECL)
     exp = DECL_INITIAL (exp);
 
-  /* Some expression lowering may request an address of a compile-time constant.
-     Make sure it is assigned to a location we can reference.  */
-  if (CONSTANT_CLASS_P (exp) && TREE_CODE (exp) != STRING_CST)
+  /* Some expression lowering may request an address of a compile-time constant,
+     or other non-lvalue expression.  Make sure it is assigned to a location we
+     can reference.  */
+  if ((CONSTANT_CLASS_P (exp) && TREE_CODE (exp) != STRING_CST)
+      || TREE_CODE (exp) == CALL_EXPR)
     exp = force_target_expr (exp);
 
   d_mark_addressable (exp);
index 17387f6a7bcb5443cb6f79a3ae56623dc1297aa0..ed12eadfd1644efaa1034d2e84c3cdeedec86d60 100644 (file)
@@ -1,3 +1,8 @@
+2019-08-10  Iain Buclaw  <ibuclaw@gdcproject.org>
+
+       PR d/91238
+       * gdc.dg/pr91238.d: New test.
+
 2019-08-10  Jakub Jelinek  <jakub@redhat.com>
 
        * c-c++-common/gomp/declare-target-2.c: Don't expect error for
diff --git a/gcc/testsuite/gdc.dg/pr91238.d b/gcc/testsuite/gdc.dg/pr91238.d
new file mode 100644 (file)
index 0000000..26efb90
--- /dev/null
@@ -0,0 +1,18 @@
+// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91238
+// { dg-do compile }
+
+alias T = const(char)*;
+
+T name()
+{
+    return "";
+}
+
+void collect(ref T)
+{
+}
+
+void configure(T[T] targets)
+{
+    collect(targets[name]);
+}