diff options
author | Iain Buclaw <ibuclaw@gdcproject.org> | 2019-08-10 14:11:49 +0000 |
---|---|---|
committer | Iain Buclaw <ibuclaw@gcc.gnu.org> | 2019-08-10 14:11:49 +0000 |
commit | 884efbd523b7191edd7763ae8bba8afc96e3c238 (patch) | |
tree | ed325cb3a0094824e1a0f426ec64e3ea7964608b /gcc/d | |
parent | 77eb117f588686e6fb018d103fc3d1899be9b008 (diff) | |
download | gcc-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/d')
-rw-r--r-- | gcc/d/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/d/d-codegen.cc | 8 |
2 files changed, 11 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); |