From: Marek Polacek Date: Fri, 17 Oct 2014 18:53:35 +0000 (+0000) Subject: re PR c/63543 (incomplete type error should suppress duplicates) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d9b7be2ebd0cf4652590c2db4313c8435a9a66a9;p=gcc.git 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 --- diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index bb57ee22d41..294b4ef54ad 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,10 @@ +2014-10-17 Marek Polacek + + 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 PR c/63549 diff --git a/gcc/c/c-tree.h b/gcc/c/c-tree.h index e6aca01923b..5ff9d9ccce9 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 1e971c1b672..324736acdf4 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 f9e3458477c..29ed3e6956d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2014-10-17 Marek Polacek + + 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 PR c/63549 diff --git a/gcc/testsuite/gcc.dg/array-8.c b/gcc/testsuite/gcc.dg/array-8.c index d469a80eaf2..2872985806e 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 877c4c2a881..4b833fb3da0 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 a7969837bf5..954c411c5c4 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 00000000000..215b62ed911 --- /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; +}