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

--- Comment #6 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <ja...@gcc.gnu.org>:

https://gcc.gnu.org/g:48e54fea7ba4a7cb7b3d1505951383120220e394

commit r10-8057-g48e54fea7ba4a7cb7b3d1505951383120220e394
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Wed Apr 29 22:38:01 2020 +0200

    s390: Fix up -Wpsabi diagnostics + [[no_unique_address]] empty member fix
[PR94704]

    So, based on the yesterday's discussions, similarly to powerpc64le-linux
    I've done some testing for s390x-linux too.

    First of all, I found a bug in my patch from yesterday, it was printing
    the wrong type like 'double' etc. rather than the class that contained such
    the element.  Fix below.

    For s390x-linux, I was using
    struct X { };
    struct Y { int : 0; };
    struct Z { int : 0; Y y; };
    struct U : public X { X q; };
    struct A { double a; };
    struct B : public X { double a; };
    struct C : public Y { double a; };
    struct D : public Z { double a; };
    struct E : public U { double a; };
    struct F { [[no_unique_address]] X x; double a; };
    struct G { [[no_unique_address]] Y y; double a; };
    struct H { [[no_unique_address]] Z z; double a; };
    struct I { [[no_unique_address]] U u; double a; };
    struct J { double a; [[no_unique_address]] X x; };
    struct K { double a; [[no_unique_address]] Y y; };
    struct L { double a; [[no_unique_address]] Z z; };
    struct M { double a; [[no_unique_address]] U u; };
     #define T(S, s) extern S s; extern void foo##s (S); int bar##s () { foo##s
(s); return 0; }
    T (A, a)
    T (B, b)
    T (C, c)
    T (D, d)
    T (E, e)
    T (F, f)
    T (G, g)
    T (H, h)
    T (I, i)
    T (J, j)
    T (K, k)
    T (L, l)
    T (M, m)
    as testcase and looking for "\tld\t%f0,".
    While g++ 9 with -std=c++17 used to pass in fpr just
    A, g++ 9 -std=c++14, as well as current trunk -std=c++14 & 17
    and clang++ from today -std=c++14 & 17 all pass A, B, C
    in fpr and nothing else.  The intent stated by Jason seems to be
    that A, B, C, F, G, J, K should all be passed in fpr.

    Attached are two (updated) versions of the patch on top of the
    powerpc+middle-end patch just posted.

    The first one emits two separate -Wpsabi warnings like powerpc, one for
    the -std=c++14 vs. -std=c++17 ABI difference and one for GCC 9 vs. 10
    [[no_unique_address]] passing changes, the other one is silent about the
    second case.

    2020-04-29  Jakub Jelinek  <ja...@redhat.com>

            PR target/94704
            * config/s390/s390.c (s390_function_arg_vector,
            s390_function_arg_float): Use DECL_FIELD_ABI_IGNORED instead of
            cxx17_empty_base_field_p.  In -Wpsabi diagnostics use the type
            passed to the function rather than the type of the single element.
            Rename cxx17_empty_base_seen variable to empty_base_seen, change
            type to int, and adjust diagnostics depending on if the field
            has [[no_unique_attribute]] or not.

            * g++.target/s390/s390.exp: New file.
            * g++.target/s390/pr94704-1.C: New test.
            * g++.target/s390/pr94704-2.C: New test.
            * g++.target/s390/pr94704-3.C: New test.
            * g++.target/s390/pr94704-4.C: New test.

Reply via email to