aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Sebor <msebor@gcc.gnu.org>2016-01-21 16:19:05 -0700
committerMartin Sebor <msebor@gcc.gnu.org>2016-01-21 16:19:05 -0700
commit9f04a53e1d467c4ba12f44b30da8e4d9aaee5506 (patch)
tree92afd7c0ab9ff54a2337894b9d0b738900a4372d /gcc
parent38a516638d2ea1fd4dade9bd68ec720ff6fe52f0 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/c-family/c-common.c7
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gcc.dg/sync-fetch.c115
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" } */
+}