aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2014-10-17 18:53:35 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2014-10-17 18:53:35 +0000
commitd9b7be2ebd0cf4652590c2db4313c8435a9a66a9 (patch)
tree5864967c12d70d6e72ca16b0a2535367e7f5778b
parentf406ae1fd66cbef7528139d813049d606973b4d2 (diff)
downloadgcc-d9b7be2ebd0cf4652590c2db4313c8435a9a66a9.zip
gcc-d9b7be2ebd0cf4652590c2db4313c8435a9a66a9.tar.gz
gcc-d9b7be2ebd0cf4652590c2db4313c8435a9a66a9.tar.bz2
re PR c/63543 (incomplete type error should suppress duplicates)
PR c/63543 * c-tree.h (C_TYPE_ERROR_REPORTED): Define. * c-typeck.c (build_indirect_ref): Don't print the "dereferencing..." error multiple times. Print the type. * gcc.dg/pr63543.c: New test. * gcc.dg/array-8.c: Remove dg-error. * gcc.dg/pr48552-1.c: Remove and adjust dg-error. * gcc.dg/pr48552-2.c: Likewise. From-SVN: r216414
-rw-r--r--gcc/c/ChangeLog7
-rw-r--r--gcc/c/c-tree.h3
-rw-r--r--gcc/c/c-typeck.c7
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/gcc.dg/array-8.c1
-rw-r--r--gcc/testsuite/gcc.dg/pr48552-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/pr48552-2.c4
-rw-r--r--gcc/testsuite/gcc.dg/pr63543.c21
8 files changed, 49 insertions, 6 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index bb57ee2..294b4ef 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -1,5 +1,12 @@
2014-10-17 Marek Polacek <polacek@redhat.com>
+ PR c/63543
+ * c-tree.h (C_TYPE_ERROR_REPORTED): Define.
+ * c-typeck.c (build_indirect_ref): Don't print the "dereferencing..."
+ error multiple times. Print the type.
+
+2014-10-17 Marek Polacek <polacek@redhat.com>
+
PR c/63549
* c-typeck.c (build_array_ref): Bail if the index in an incomplete
type.
diff --git a/gcc/c/c-tree.h b/gcc/c/c-tree.h
index e6aca01..5ff9d9c 100644
--- a/gcc/c/c-tree.h
+++ b/gcc/c/c-tree.h
@@ -56,6 +56,9 @@ along with GCC; see the file COPYING3. If not see
This is used for -Wc++-compat. */
#define C_TYPE_DEFINED_IN_STRUCT(TYPE) TYPE_LANG_FLAG_2 (TYPE)
+/* Record whether an "incomplete type" error was given for the type. */
+#define C_TYPE_ERROR_REPORTED(TYPE) TYPE_LANG_FLAG_3 (TYPE)
+
/* Record whether a typedef for type `int' was actually `signed int'. */
#define C_TYPEDEF_EXPLICITLY_SIGNED(EXP) DECL_LANG_FLAG_1 (EXP)
diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c
index 1e971c1..324736a 100644
--- a/gcc/c/c-typeck.c
+++ b/gcc/c/c-typeck.c
@@ -2378,7 +2378,12 @@ build_indirect_ref (location_t loc, tree ptr, ref_operator errstring)
if (!COMPLETE_OR_VOID_TYPE_P (t) && TREE_CODE (t) != ARRAY_TYPE)
{
- error_at (loc, "dereferencing pointer to incomplete type");
+ if (!C_TYPE_ERROR_REPORTED (TREE_TYPE (ptr)))
+ {
+ error_at (loc, "dereferencing pointer to incomplete type "
+ "%qT", t);
+ C_TYPE_ERROR_REPORTED (TREE_TYPE (ptr)) = 1;
+ }
return error_mark_node;
}
if (VOID_TYPE_P (t) && c_inhibit_evaluation_warnings == 0)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f9e3458..29ed3e6 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,13 @@
2014-10-17 Marek Polacek <polacek@redhat.com>
+ PR c/63543
+ * gcc.dg/pr63543.c: New test.
+ * gcc.dg/array-8.c: Remove dg-error.
+ * gcc.dg/pr48552-1.c: Remove and adjust dg-error.
+ * gcc.dg/pr48552-2.c: Likewise.
+
+2014-10-17 Marek Polacek <polacek@redhat.com>
+
PR c/63549
* gcc.dg/pr63549.c: New test.
diff --git a/gcc/testsuite/gcc.dg/array-8.c b/gcc/testsuite/gcc.dg/array-8.c
index d469a80..2872985 100644
--- a/gcc/testsuite/gcc.dg/array-8.c
+++ b/gcc/testsuite/gcc.dg/array-8.c
@@ -45,5 +45,4 @@ g (void)
sip[0]; /* { dg-error "invalid use of undefined type 'struct si'" } */
/* { dg-error "dereferencing pointer to incomplete type" "incomplete" { target *-*-* } 45 } */
0[sip]; /* { dg-error "invalid use of undefined type 'struct si'" } */
- /* { dg-error "dereferencing pointer to incomplete type" "incomplete" { target *-*-* } 47 } */
}
diff --git a/gcc/testsuite/gcc.dg/pr48552-1.c b/gcc/testsuite/gcc.dg/pr48552-1.c
index 877c4c2..4b833fb 100644
--- a/gcc/testsuite/gcc.dg/pr48552-1.c
+++ b/gcc/testsuite/gcc.dg/pr48552-1.c
@@ -49,5 +49,5 @@ f7 (struct S *x)
void
f8 (struct S *x)
{
- __asm volatile ("" : "=r" (*x)); /* { dg-error "dereferencing pointer to incomplete type" "incomplete" } */
-} /* { dg-error "invalid lvalue in asm output 0" "invalid lvalue" { target *-*-* } 52 } */
+ __asm volatile ("" : "=r" (*x)); /* { dg-error "invalid lvalue in asm output 0" } */
+}
diff --git a/gcc/testsuite/gcc.dg/pr48552-2.c b/gcc/testsuite/gcc.dg/pr48552-2.c
index a796983..954c411 100644
--- a/gcc/testsuite/gcc.dg/pr48552-2.c
+++ b/gcc/testsuite/gcc.dg/pr48552-2.c
@@ -49,5 +49,5 @@ f7 (struct S *x)
void
f8 (struct S *x)
{
- __asm ("" : "=r" (*x)); /* { dg-error "dereferencing pointer to incomplete type" "incomplete" } */
-} /* { dg-error "invalid lvalue in asm output 0" "invalid lvalue" { target *-*-* } 52 } */
+ __asm ("" : "=r" (*x)); /* { dg-error "invalid lvalue in asm output 0" } */
+}
diff --git a/gcc/testsuite/gcc.dg/pr63543.c b/gcc/testsuite/gcc.dg/pr63543.c
new file mode 100644
index 0000000..215b62e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr63543.c
@@ -0,0 +1,21 @@
+/* PR c/63543 */
+/* { dg-do compile } */
+
+struct S;
+union U;
+
+int
+f1 (struct S *s)
+{
+ return s->a /* { dg-error "dereferencing pointer to incomplete type .struct S." } */
+ + s->b
+ + s->c;
+}
+
+int
+f2 (union U *u)
+{
+ return u->a /* { dg-error "dereferencing pointer to incomplete type .union U." } */
+ + u->a
+ + u->a;
+}