[WIP C++ PATCH] P0217R3 - C++17 structured bindings
Jason Merrill
jason@redhat.com
Mon Nov 14 05:04:00 GMT 2016
On Wed, Nov 9, 2016 at 7:24 AM, Jakub Jelinek <jakub@redhat.com> wrote:
> The match.pd hunk is needed, otherwise the generic folding happily folds
> int arr[2];
> ...
> auto [ x, y ] = arr;
> &x == &arr[0]
> into 0, because it thinks x and arr are distinct VAR_DECLs. Though, if
> such comparisons are required to be folded in constexpr contexts under
> certain conditions, we'd need to handle the DECL_VALUE_EXPRs in constexpr.c
> somehow.
What do you think of this approach instead?
-------------- next part --------------
commit 7aa4bc14bdd8f01937ce2dc148722f0468d66d1b
Author: Jason Merrill <jason@redhat.com>
Date: Sun Nov 13 19:17:40 2016 -0500
addr_base
diff --git a/gcc/match.pd b/gcc/match.pd
index 79a418f..29ddcd8 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -2547,15 +2547,8 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(with
{
int equal = 2;
- /* Punt in GENERIC on variables with value expressions;
- the value expressions might point to fields/elements
- of other vars etc. */
- if (GENERIC
- && ((VAR_P (base0) && DECL_HAS_VALUE_EXPR_P (base0))
- || (VAR_P (base1) && DECL_HAS_VALUE_EXPR_P (base1))))
- ;
- else if (decl_in_symtab_p (base0)
- && decl_in_symtab_p (base1))
+ if (decl_in_symtab_p (base0)
+ && decl_in_symtab_p (base1))
equal = symtab_node::get_create (base0)
->equal_address_to (symtab_node::get_create (base1));
else if ((DECL_P (base0)
diff --git a/gcc/tree-dfa.c b/gcc/tree-dfa.c
index 0396feb..0a8523b 100644
--- a/gcc/tree-dfa.c
+++ b/gcc/tree-dfa.c
@@ -673,6 +673,15 @@ get_addr_base_and_unit_offset_1 (tree exp, HOST_WIDE_INT *poffset,
{
switch (TREE_CODE (exp))
{
+ case VAR_DECL:
+ if (DECL_HAS_VALUE_EXPR_P (exp))
+ {
+ exp = DECL_VALUE_EXPR (exp);
+ continue;
+ }
+ else
+ goto done;
+
case BIT_FIELD_REF:
{
HOST_WIDE_INT this_off = TREE_INT_CST_LOW (TREE_OPERAND (exp, 2));
More information about the Gcc-patches
mailing list