This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c/68162] [5/6 Regression] Incompatible pointer type using a typedef


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68162

--- Comment #15 from Joseph S. Myers <jsm28 at gcc dot gnu.org> ---
Author: jsm28
Date: Wed Dec  2 18:24:23 2015
New Revision: 231194

URL: https://gcc.gnu.org/viewcvs?rev=231194&root=gcc&view=rev
Log:
Fix TYPE_MAIN_VARIANT construction for arrays of qualified typedefs (PR
c/68162).

PR c/68162 reports a spurious warning about incompatible types
involving arrays of const double, constructed in one place using a
typedef for const double and in another place literally using const
double.

The problem is that the array of the typedef was incorrectly
constructed without a TYPE_MAIN_VARIANT being an array of unqualified
elements as it should be (though it seems some more recent change
resulted in this producing incorrect diagnostics, likely the support
for C++-style handling of arrays of qualified type).  This patch fixes
the logic in grokdeclarator to determine first_non_attr_kind, which is
used to determine whether it is necessary to use the TYPE_MAIN_VARIANT
of the type in the declaration specifiers.

However, fixing that logic introduces a failure of
gcc.dg/debug/dwarf2/pr47939-4.c, a test introduced along with
first_non_attr_kind.  Thus, it is necessary to track the original
qualified typedef when qualifying an array type, to use it rather than
a newly-constructed type, to avoid regressing regarding typedef names
in debug info.  This is done along lines I suggested in
<https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47939#c6>: track the
original type and the number of levels of array indirection at which
it appears, and, in possibly affected cases, pass extra arguments to
c_build_qualified_type (with default arguments to avoid needing to
pass those extra arguments explicitly everywhere).  Given Richard's
recent fix to dwarf2out.c, this allows the C bug to be fixed without
causing debug information regressions.

Bootstrapped with no regressions on x86_64-pc-linux-gnu.

gcc/c:
        PR c/68162
        * c-decl.c (grokdeclarator): Set first_non_attr_kind before
        following link from declarator to next declarator.  Track original
        qualified type and pass it to c_build_qualified_type.
        * c-typeck.c (c_build_qualified_type): Add arguments
        orig_qual_type and orig_qual_indirect.

gcc/c-family:
        PR c/68162
        * c-common.h (c_build_qualified_type): Add extra default
        arguments.

gcc/cp:
        PR c/68162
        * tree.c (c_build_qualified_type): Add extra arguments.

gcc/testsuite:
        PR c/68162
        * gcc.dg/pr68162-1.c: New test.

Added:
    trunk/gcc/testsuite/gcc.dg/pr68162-1.c
Modified:
    trunk/gcc/c-family/ChangeLog
    trunk/gcc/c-family/c-common.h
    trunk/gcc/c/ChangeLog
    trunk/gcc/c/c-decl.c
    trunk/gcc/c/c-typeck.c
    trunk/gcc/cp/ChangeLog
    trunk/gcc/cp/tree.c
    trunk/gcc/testsuite/ChangeLog

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]