diff options
author | Jakub Jelinek <jakub@redhat.com> | 2017-01-11 21:10:36 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2017-01-11 21:10:36 +0100 |
commit | eae63d784c503ad7954ac8ae28232aec635ac7fc (patch) | |
tree | 445f6cd62d154885a446d235163b694f1b08a014 | |
parent | 88df7964b5aa1b8cc2226177da25785c58b7c7e2 (diff) | |
download | gcc-eae63d784c503ad7954ac8ae28232aec635ac7fc.zip gcc-eae63d784c503ad7954ac8ae28232aec635ac7fc.tar.gz gcc-eae63d784c503ad7954ac8ae28232aec635ac7fc.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fold-const.c | 17 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/constexpr-71537.C | 14 |
4 files changed, 32 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e46392c..82847b9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 73ebd76..cfd270c 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b22c2e3..b8cd53a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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. diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-71537.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-71537.C new file mode 100644 index 0000000..5d468d7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/constexpr-71537.C @@ -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 (), ""); |