Hi Jakub,

On Tue, Feb 11, 2025 at 07:04:31PM +0100, Jakub Jelinek wrote:
> The following testcase IMO in violation of the P2552R3 paper doesn't
> pedwarn on alignas applying to dependent types or alignas with dependent
> argument.
> 
> tsubst was just ignoring TYPE_ATTRIBUTES.
> 
> The following patch fixes it for the POINTER/REFERENCE_TYPE and
> ARRAY_TYPE cases, but perhaps we need to do the same also for other
> types (INTEGER_TYPE/REAL_TYPE and the like).  I guess I'll need to
> construct more testcases.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
> 
> 2025-02-11  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR c++/118787
>       * pt.cc (tsubst) <case ARRAY_TYPE>: Use return t; only if it doesn't
>       have any TYPE_ATTRIBUTES.  Call apply_late_template_attributes.
>       <case POINTER_TYPE, case REFERENCE_TYPE>: Likewise.  Formatting fix.
> 
>       * g++.dg/cpp0x/alignas22.C: New test.

This seems to have broken the gcc-fedora-mingw build:
https://builder.sourceware.org/buildbot/#/builders/262/builds/11014

In file included from 
/home/builder/shared/bb2-1/worker/gcc-fedora-mingw/gcc-build/x86_64-w64-mingw32/libstdc++-v3/include/bits/basic_string.h:4230,
                 from 
/home/builder/shared/bb2-1/worker/gcc-fedora-mingw/gcc-build/x86_64-w64-mingw32/libstdc++-v3/include/string:56,
                 from 
/home/builder/shared/bb2-1/worker/gcc-fedora-mingw/gcc-build/x86_64-w64-mingw32/libstdc++-v3/include/bits/locale_classes.h:42,
                 from 
/home/builder/shared/bb2-1/worker/gcc-fedora-mingw/gcc-build/x86_64-w64-mingw32/libstdc++-v3/include/codecvt:42,
                 from ../../../../../gcc/libstdc++-v3/src/c++11/codecvt.cc:25:
/home/builder/shared/bb2-1/worker/gcc-fedora-mingw/gcc-build/x86_64-w64-mingw32/libstdc++-v3/include/ext/string_conversions.h:
 In substitution of 'template<class _String, class _CharT> _String 
__gnu_cxx::__to_xstring(int (*)(_CharT*, std::size_t, const _CharT*, char*), 
std::size_t, const _CharT*, ...) [with _String = 
std::__cxx11::basic_string<char>; _CharT = char]':
/home/builder/shared/bb2-1/worker/gcc-fedora-mingw/gcc-build/x86_64-w64-mingw32/libstdc++-v3/include/bits/basic_string.h:4483:43:
   required from here
 4483 |     return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, __n,
      |            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
 4484 |                                            "%f", __val);
      |                                            ~~~~~~~~~~~~
/home/builder/shared/bb2-1/worker/gcc-fedora-mingw/gcc-build/x86_64-w64-mingw32/libstdc++-v3/include/ext/string_conversions.h:103:5:
 internal compiler error: in apply_late_template_attributes, at cp/pt.cc:12403
  103 |     __to_xstring(int (*__convf) (_CharT*, std::size_t, const _CharT*,
      |     ^~~~~~~~~~~~
0x2529c91 internal_error(char const*, ...)
          ../../gcc/gcc/diagnostic-global-context.cc:517
0x715e09 fancy_abort(char const*, int, char const*)
         ../../gcc/gcc/diagnostic.cc:1722
0x4a4034 apply_late_template_attributes
         ../../gcc/gcc/cp/pt.cc:12403
0x95be8d tsubst(tree_node*, tree_node*, int, tree_node*)
         ../../gcc/gcc/cp/pt.cc:16951
0x9741c4 tsubst_arg_types
         ../../gcc/gcc/cp/pt.cc:16022
0x9740e9 tsubst_arg_types
         ../../gcc/gcc/cp/pt.cc:15999
0x9740e9 tsubst_arg_types
         ../../gcc/gcc/cp/pt.cc:16058
0x9740e9 tsubst_arg_types
         ../../gcc/gcc/cp/pt.cc:15999
0x9740e9 tsubst_arg_types
         ../../gcc/gcc/cp/pt.cc:16058
0x9740e9 tsubst_arg_types
         ../../gcc/gcc/cp/pt.cc:15999
0x9740e9 tsubst_arg_types
         ../../gcc/gcc/cp/pt.cc:16058
0x974561 tsubst_arg_types
         ../../gcc/gcc/cp/pt.cc:15999
0x974561 tsubst_function_type
         ../../gcc/gcc/cp/pt.cc:16176
0x95bd6a tsubst(tree_node*, tree_node*, int, tree_node*)
         ../../gcc/gcc/cp/pt.cc:17009
0x95afd7 tsubst(tree_node*, tree_node*, int, tree_node*)
         ../../gcc/gcc/cp/pt.cc:16521
0x9741c4 tsubst_arg_types
         ../../gcc/gcc/cp/pt.cc:16022
0x974561 tsubst_arg_types
         ../../gcc/gcc/cp/pt.cc:15999
0x974561 tsubst_function_type
         ../../gcc/gcc/cp/pt.cc:16176
0x95bd6a tsubst(tree_node*, tree_node*, int, tree_node*)
         ../../gcc/gcc/cp/pt.cc:17009
0x96a866 tsubst_function_decl
         ../../gcc/gcc/cp/pt.cc:14834
Please submit a full bug report, with preprocessed source (by using 
-freport-bug).
Please include the complete backtrace with any bug report.
See <https://gcc.gnu.org/bugs/> for instructions.
make[5]: *** [Makefile:883: codecvt.lo] Error 1

> --- gcc/cp/pt.cc.jj   2025-02-07 17:03:13.560227281 +0100
> +++ gcc/cp/pt.cc      2025-02-10 17:17:47.651313333 +0100
> @@ -16854,7 +16854,9 @@ tsubst (tree t, tree args, tsubst_flags_
>      case POINTER_TYPE:
>      case REFERENCE_TYPE:
>        {
> -     if (type == TREE_TYPE (t) && TREE_CODE (type) != METHOD_TYPE)
> +     if (type == TREE_TYPE (t)
> +         && TREE_CODE (type) != METHOD_TYPE
> +         && TYPE_ATTRIBUTES (t) == NULL_TREE)
>         return t;
>  
>       /* [temp.deduct]
> @@ -16924,9 +16926,9 @@ tsubst (tree t, tree args, tsubst_flags_
>            A,' while an attempt to create the type type rvalue reference to
>            cv T' creates the type T"
>         */
> -       r = cp_build_reference_type
> -           (TREE_TYPE (type),
> -            TYPE_REF_IS_RVALUE (t) && TYPE_REF_IS_RVALUE (type));
> +       r = cp_build_reference_type (TREE_TYPE (type),
> +                                    TYPE_REF_IS_RVALUE (t)
> +                                    && TYPE_REF_IS_RVALUE (type));
>       else
>         r = cp_build_reference_type (type, TYPE_REF_IS_RVALUE (t));
>       r = cp_build_qualified_type (r, cp_type_quals (t), complain);
> @@ -16935,6 +16937,11 @@ tsubst (tree t, tree args, tsubst_flags_
>         /* Will this ever be needed for TYPE_..._TO values?  */
>         layout_type (r);
>  
> +     if (!apply_late_template_attributes (&r, TYPE_ATTRIBUTES (t),
> +                                          /*flags=*/0,
> +                                          args, complain, in_decl))
> +       return error_mark_node;
> +
>       return r;
>        }
>      case OFFSET_TYPE:
> @@ -17009,7 +17016,9 @@ tsubst (tree t, tree args, tsubst_flags_
>  
>       /* As an optimization, we avoid regenerating the array type if
>          it will obviously be the same as T.  */
> -     if (type == TREE_TYPE (t) && domain == TYPE_DOMAIN (t))
> +     if (type == TREE_TYPE (t)
> +         && domain == TYPE_DOMAIN (t)
> +         && TYPE_ATTRIBUTES (t) == NULL_TREE)
>         return t;
>  
>       /* These checks should match the ones in create_array_type_for_decl.
> @@ -17048,6 +17057,11 @@ tsubst (tree t, tree args, tsubst_flags_
>           TYPE_USER_ALIGN (r) = 1;
>         }
>  
> +     if (!apply_late_template_attributes (&r, TYPE_ATTRIBUTES (t),
> +                                          /*flags=*/0,
> +                                          args, complain, in_decl))
> +       return error_mark_node;
> +
>       return r;
>        }
>  
> --- gcc/testsuite/g++.dg/cpp0x/alignas22.C.jj 2025-02-10 17:33:16.242452750 
> +0100
> +++ gcc/testsuite/g++.dg/cpp0x/alignas22.C    2025-02-10 17:36:28.739046629 
> +0100
> @@ -0,0 +1,23 @@
> +// PR c++/118787
> +// { dg-do compile { target c++11 } }
> +// { dg-options "-pedantic" }
> +
> +template <typename T, int N>
> +void foo (T & alignas (N));          // { dg-warning "'alignas' on a type 
> other than class" }
> +template <typename T, int N>
> +void bar (T (&)[N] alignas (N));     // { dg-warning "'alignas' on a type 
> other than class" }
> +template <typename T, int N>
> +using U = T * alignas (N);           // { dg-warning "'alignas' on a type 
> other than class" }
> +template <typename T, int N>
> +using V = T[N] alignas (N);          // { dg-warning "'alignas' on a type 
> other than class" }
> +
> +void
> +baz ()
> +{
> +  int x alignas (4) = 0;
> +  foo <int, 4> (x);
> +  int y alignas (4) [4];
> +  bar <int, 4> (y);
> +  U <int, 4> u;
> +  V <int, 4> v;
> +}
> 
>       Jakub
> 

Reply via email to