From cde1a31d5437de9e8dcf38feb81573f3cf7c2b39 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 25 Jun 2018 18:48:43 +0200 Subject: [PATCH] backport: re PR c++/83059 (ICE on invalid C++ code: in tree_to_uhwi, at tree.c:6633) Backported from mainline 2017-11-21 Jakub Jelinek PR c++/83059 * c-common.c (get_atomic_generic_size): Use TREE_INT_CST_LOW instead of tree_to_uhwi, formatting fix. * c-c++-common/pr83059.c: New test. From-SVN: r262032 --- gcc/c-family/ChangeLog | 9 +++++++++ gcc/c-family/c-common.c | 15 ++++++++------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/c-c++-common/pr83059.c | 10 ++++++++++ 4 files changed, 32 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/pr83059.c diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 39314b27ef02..c9f7773022d8 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,12 @@ +2018-06-25 Jakub Jelinek + + Backported from mainline + 2017-11-21 Jakub Jelinek + + PR c++/83059 + * c-common.c (get_atomic_generic_size): Use TREE_INT_CST_LOW + instead of tree_to_uhwi, formatting fix. + 2018-06-20 Richard Biener Backport from mainline diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index d6572f71d0dc..ad029ea6b3d2 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -10963,13 +10963,14 @@ get_atomic_generic_size (location_t loc, tree function, tree p = (*params)[x]; if (TREE_CODE (p) == INTEGER_CST) { - int i = tree_to_uhwi (p); - if (i < 0 || (memmodel_base (i) >= MEMMODEL_LAST)) - { - warning_at (loc, OPT_Winvalid_memory_model, - "invalid memory model argument %d of %qE", x + 1, - function); - } + /* memmodel_base masks the low 16 bits, thus ignore any bits above + it by using TREE_INT_CST_LOW instead of tree_to_*hwi. Those high + bits will be checked later during expansion in target specific + way. */ + if (memmodel_base (TREE_INT_CST_LOW (p)) >= MEMMODEL_LAST) + warning_at (loc, OPT_Winvalid_memory_model, + "invalid memory model argument %d of %qE", x + 1, + function); } else if (!INTEGRAL_TYPE_P (TREE_TYPE (p))) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a9629a6e0c4e..51b8a478c141 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ 2018-06-25 Jakub Jelinek Backported from mainline + 2017-11-21 Jakub Jelinek + + PR c++/83059 + * c-c++-common/pr83059.c: New test. + 2017-11-20 Jakub Jelinek PR c++/82781 diff --git a/gcc/testsuite/c-c++-common/pr83059.c b/gcc/testsuite/c-c++-common/pr83059.c new file mode 100644 index 000000000000..9a6ff5e0db20 --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr83059.c @@ -0,0 +1,10 @@ +/* PR c++/83059 */ +/* { dg-do compile } */ + +void +foo (int *p, int *q, int *r) +{ + __atomic_compare_exchange (p, q, r, 0, 0, -1); /* { dg-warning "invalid memory model argument 6" } */ + /* { dg-warning "\[uU]nknown architecture specifi" "" { target *-*-* } .-1 } */ + /* { dg-warning "failure memory model cannot be stronger than success memory model" "" { target *-*-* } .-2 } */ +} -- 2.47.2