summaryrefslogtreecommitdiff
path: root/gcc/d
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/d
parent77eb117f588686e6fb018d103fc3d1899be9b008 (diff)
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/d')
-rw-r--r--gcc/d/ChangeLog6
-rw-r--r--gcc/d/d-codegen.cc8
2 files changed, 11 insertions, 3 deletions
diff --git a/gcc/d/ChangeLog b/gcc/d/ChangeLog
index b2a94ea033a..04eaccf3fed 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 1971064e334..cf50693b2f5 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);