aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIain Buclaw <ibuclaw@gdcproject.org>2019-08-10 14:11:49 +0000
committerIain Buclaw <ibuclaw@gcc.gnu.org>2019-08-10 14:11:49 +0000
commit884efbd523b7191edd7763ae8bba8afc96e3c238 (patch)
treeed325cb3a0094824e1a0f426ec64e3ea7964608b /gcc
parent77eb117f588686e6fb018d103fc3d1899be9b008 (diff)
downloadgcc-884efbd523b7191edd7763ae8bba8afc96e3c238.zip
gcc-884efbd523b7191edd7763ae8bba8afc96e3c238.tar.gz
gcc-884efbd523b7191edd7763ae8bba8afc96e3c238.tar.bz2
d: Fix internal compiler error: in add_expr, at tree.c:7794
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/d/ChangeLog6
-rw-r--r--gcc/d/d-codegen.cc8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gdc.dg/pr91238.d18
4 files changed, 34 insertions, 3 deletions
diff --git a/gcc/d/ChangeLog b/gcc/d/ChangeLog
index b2a94ea..04eaccf 100644
--- a/gcc/d/ChangeLog
+++ b/gcc/d/ChangeLog
@@ -1,5 +1,11 @@
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
* runtime.cc (enum libcall_type): Rename to...
(enum d_libcall_type): ...this.
diff --git a/gcc/d/d-codegen.cc b/gcc/d/d-codegen.cc
index 1971064..cf50693 100644
--- a/gcc/d/d-codegen.cc
+++ b/gcc/d/d-codegen.cc
@@ -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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 17387f6..ed12ead 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..26efb90
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/pr91238.d
@@ -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]);
+}