mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-24 12:31:25 +08:00
re PR c++/71537 (GCC rejects consetxpr boolean conversions and comparisons on the result of pointer arithmetic.)
PR c++/71537 * fold-const.c (maybe_nonzero_address): Return 1 for function local objects. (tree_single_nonzero_warnv_p): Don't handle function local objects here. * g++.dg/cpp1y/constexpr-71537.C: New test. From-SVN: r244333
This commit is contained in:
parent
88df7964b5
commit
eae63d784c
gcc
@ -1,5 +1,11 @@
|
||||
2017-01-11 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/71537
|
||||
* fold-const.c (maybe_nonzero_address): Return 1 for function
|
||||
local objects.
|
||||
(tree_single_nonzero_warnv_p): Don't handle function local objects
|
||||
here.
|
||||
|
||||
PR c++/72813
|
||||
* gcc.c (default_compilers): Don't add -o %g.s for -S -save-temps
|
||||
of c-header.
|
||||
|
@ -8171,7 +8171,8 @@ pointer_may_wrap_p (tree base, tree offset, HOST_WIDE_INT bitpos)
|
||||
/* Return a positive integer when the symbol DECL is known to have
|
||||
a nonzero address, zero when it's known not to (e.g., it's a weak
|
||||
symbol), and a negative integer when the symbol is not yet in the
|
||||
symbol table and so whether or not its address is zero is unknown. */
|
||||
symbol table and so whether or not its address is zero is unknown.
|
||||
For function local objects always return positive integer. */
|
||||
static int
|
||||
maybe_nonzero_address (tree decl)
|
||||
{
|
||||
@ -8179,6 +8180,13 @@ maybe_nonzero_address (tree decl)
|
||||
if (struct symtab_node *symbol = symtab_node::get_create (decl))
|
||||
return symbol->nonzero_address ();
|
||||
|
||||
/* Function local objects are never NULL. */
|
||||
if (DECL_P (decl)
|
||||
&& (DECL_CONTEXT (decl)
|
||||
&& TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL
|
||||
&& auto_var_in_fn_p (decl, DECL_CONTEXT (decl))))
|
||||
return 1;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -13276,13 +13284,6 @@ tree_single_nonzero_warnv_p (tree t, bool *strict_overflow_p)
|
||||
if (nonzero_addr >= 0)
|
||||
return nonzero_addr;
|
||||
|
||||
/* Function local objects are never NULL. */
|
||||
if (DECL_P (base)
|
||||
&& (DECL_CONTEXT (base)
|
||||
&& TREE_CODE (DECL_CONTEXT (base)) == FUNCTION_DECL
|
||||
&& auto_var_in_fn_p (base, DECL_CONTEXT (base))))
|
||||
return true;
|
||||
|
||||
/* Constants are never weak. */
|
||||
if (CONSTANT_CLASS_P (base))
|
||||
return true;
|
||||
|
@ -1,5 +1,8 @@
|
||||
2017-01-11 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/71537
|
||||
* g++.dg/cpp1y/constexpr-71537.C: New test.
|
||||
|
||||
* gcc.dg/tree-ssa/flatten-3.c: Add quotation marks around dg-options
|
||||
argument.
|
||||
|
||||
|
14
gcc/testsuite/g++.dg/cpp1y/constexpr-71537.C
Normal file
14
gcc/testsuite/g++.dg/cpp1y/constexpr-71537.C
Normal file
@ -0,0 +1,14 @@
|
||||
// PR c++/71537
|
||||
// { dg-do compile { target c++14 } }
|
||||
|
||||
constexpr bool
|
||||
foo ()
|
||||
{
|
||||
constexpr int n[42] = { 1 };
|
||||
constexpr int o = n ? 1 : 0;
|
||||
constexpr int p = n + 1 ? 1 : 0;
|
||||
constexpr int q = "abc" + 1 ? 1 : 0;
|
||||
return p + p + q == 3;
|
||||
}
|
||||
|
||||
static_assert (foo (), "");
|
Loading…
x
Reference in New Issue
Block a user