diff options
author | Martin Sebor <msebor@gcc.gnu.org> | 2016-01-21 16:19:05 -0700 |
---|---|---|
committer | Martin Sebor <msebor@gcc.gnu.org> | 2016-01-21 16:19:05 -0700 |
commit | 9f04a53e1d467c4ba12f44b30da8e4d9aaee5506 (patch) | |
tree | 92afd7c0ab9ff54a2337894b9d0b738900a4372d /gcc | |
parent | 38a516638d2ea1fd4dade9bd68ec720ff6fe52f0 (diff) | |
download | gcc-9f04a53e1d467c4ba12f44b30da8e4d9aaee5506.zip gcc-9f04a53e1d467c4ba12f44b30da8e4d9aaee5506.tar.gz gcc-9f04a53e1d467c4ba12f44b30da8e4d9aaee5506.tar.bz2 |
PR c/69405 - [6 Regression] ICE in c_tree_printer on an invalid
PR c/69405 - [6 Regression] ICE in c_tree_printer on an invalid
__atomic_fetch_add
gcc/testsuite/ChangeLog:
2016-01-20 Martin Sebor <msebor@redhat.com>
PR c/69405
* gcc.dg/sync-fetch.c: New test.
gcc/c-family/ChangeLog:
2016-01-20 Martin Sebor <msebor@redhat.com>
PR c/69405
* c-common.c (sync_resolve_size): Avoid printing diagnostic about
an incompatible argument when the argument isn't a valid tree node.
From-SVN: r232713
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/c-family/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c-family/c-common.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/sync-fetch.c | 115 |
4 files changed, 132 insertions, 3 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index a22485f..7bd1d5d8 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,9 @@ +2016-01-20 Martin Sebor <msebor@redhat.com> + + PR c/69405 + * c-common.c (sync_resolve_size): Avoid printing diagnostic about + an incompatible argument when the argument isn't a valid tree node. + 2016-01-18 Jason Merrill <jason@redhat.com> PR c++/68767 diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index 1a2c21b..378afae 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -10704,8 +10704,11 @@ sync_resolve_size (tree function, vec<tree, va_gc> *params, bool fetch) return size; incompatible: - error ("operand type %qT is incompatible with argument %d of %qE", - argtype, 1, function); + /* Issue the diagnostic only if the argument is valid, otherwise + it would be redundant at best and could be misleading. */ + if (argtype != error_mark_node) + error ("operand type %qT is incompatible with argument %d of %qE", + argtype, 1, function); return 0; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 540e289..c05604b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-01-20 Martin Sebor <msebor@redhat.com> + + PR c/69405 + * gcc.dg/sync-fetch.c: New test. + 2016-01-21 Martin Sebor <msebor@redhat.com> PR target/69252 @@ -11,7 +16,7 @@ 2016-01-21 Dominik Vogt <vogt@linux.vnet.ibm.com> PR c++/68810 - * g++.dg/cpp0x/constexpr-reinterpret1.C: Fix line number that is + * g++.dg/cpp0x/constexpr-reinterpret1.C: Fix line number that is expected to generate an error. 2016-01-21 Bernd Schmidt <bschmidt@redhat.com> diff --git a/gcc/testsuite/gcc.dg/sync-fetch.c b/gcc/testsuite/gcc.dg/sync-fetch.c new file mode 100644 index 0000000..44b6cdc --- /dev/null +++ b/gcc/testsuite/gcc.dg/sync-fetch.c @@ -0,0 +1,115 @@ +/* PR c/69405 - [6 Regression] ICE in c_tree_printer on an invalid + __atomic_fetch_add */ +/* Test to verify that the diagnostic doesn't cause an ICE when any + of the arguments to __atomic_fetch_OP is undeclared. */ +/* { dg-do compile } */ + +void test_add_undeclared_first_arg (void) +{ + int a = 0; + __atomic_fetch_add (&a, &b, 0); /* { dg-error ".b. undeclared" } */ +} + +void test_sub_undeclared_first_arg (void) +{ + int a = 0; + __atomic_fetch_sub (&a, &b, 0); /* { dg-error ".b. undeclared" } */ +} + +void test_or_undeclared_first_arg (void) +{ + int a = 0; + __atomic_fetch_or (&a, &b, 0); /* { dg-error ".b. undeclared" } */ +} + +void test_and_undeclared_first_arg (void) +{ + int a = 0; + __atomic_fetch_and (&a, &b, 0); /* { dg-error ".b. undeclared" } */ +} + +void test_xor_undeclared_first_arg (void) +{ + int a = 0; + __atomic_fetch_xor (&a, &b, 0); /* { dg-error ".b. undeclared" } */ +} + +void test_nand_undeclared_first_arg (void) +{ + int a = 0; + __atomic_fetch_nand (&a, &b, 0); /* { dg-error ".b. undeclared" } */ +} + + +void test_add_undeclared_second_arg (void) +{ + int b = 0; + __atomic_fetch_add (&a, &b, 0); /* { dg-error ".a. undeclared" } */ +} + +void test_sub_undeclared_second_arg (void) +{ + int b = 0; + __atomic_fetch_sub (&a, &b, 0); /* { dg-error ".a. undeclared" } */ +} + +void test_or_undeclared_second_arg (void) +{ + int b = 0; + __atomic_fetch_or (&a, &b, 0); /* { dg-error ".a. undeclared" } */ +} + +void test_and_undeclared_second_arg (void) +{ + int b = 0; + __atomic_fetch_and (&a, &b, 0); /* { dg-error ".a. undeclared" } */ +} + +void test_xor_undeclared_second_arg (void) +{ + int b = 0; + __atomic_fetch_xor (&a, &b, 0); /* { dg-error ".a. undeclared" } */ +} + +void test_nand_undeclared_second_arg (void) +{ + int b = 0; + __atomic_fetch_nand (&a, &b, 0); /* { dg-error ".a. undeclared" } */ +} + + +void test_add_undeclared_third_arg (void) +{ + int a = 0, b = 0; + __atomic_fetch_add (&a, &b, m); /* { dg-error ".m. undeclared" } */ +} + +void test_sub_undeclared_third_arg (void) +{ + int a = 0, b = 0; + __atomic_fetch_sub (&a, &b, m); /* { dg-error ".m. undeclared" } */ +} + +void test_or_undeclared_third_arg (void) +{ + int a = 0, b = 0; + __atomic_fetch_or (&a, &b, m); /* { dg-error ".m. undeclared" } */ +} + +void test_and_undeclared_third_arg (void) +{ + int a = 0, b = 0; + __atomic_fetch_and (&a, &b, m); /* { dg-error ".m. undeclared" } */ +} + +void test_xor_undeclared_third_arg (void) +{ + int a = 0, b = 0; + __atomic_fetch_xor (&a, &b, m); /* { dg-error ".m. undeclared" } */ +} + +void test_nand_undeclared_third_arg (void) +{ + int a = 0, b = 0; + __atomic_fetch_nand (&a, &b, m); /* { dg-error ".m. undeclared" } */ +} |