diff options
author | Marek Polacek <polacek@redhat.com> | 2014-10-17 18:53:35 +0000 |
---|---|---|
committer | Marek Polacek <mpolacek@gcc.gnu.org> | 2014-10-17 18:53:35 +0000 |
commit | d9b7be2ebd0cf4652590c2db4313c8435a9a66a9 (patch) | |
tree | 5864967c12d70d6e72ca16b0a2535367e7f5778b /gcc/c | |
parent | f406ae1fd66cbef7528139d813049d606973b4d2 (diff) | |
download | gcc-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
Diffstat (limited to 'gcc/c')
-rw-r--r-- | gcc/c/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/c/c-tree.h | 3 | ||||
-rw-r--r-- | gcc/c/c-typeck.c | 7 |
3 files changed, 16 insertions, 1 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) |