On Mon, Jun 29, 2020 at 1:25 PM Martin Liška <mli...@suse.cz> wrote:
>
> On 6/29/20 4:57 PM, Marek Polacek wrote:
> > On Mon, Jun 29, 2020 at 09:51:57AM +0200, Martin Liška wrote:
> >> On 6/26/20 9:34 PM, Marek Polacek via Gcc-patches wrote:
> >>> As discussed last month:
> >>> <https://gcc.gnu.org/pipermail/gcc-patches/2020-May/545879.html>
> >>> it's time to change the C++ default to gnu++17.  I've committed the patch 
> >>> after
> >>> testing x86_64-pc-linux-gnu and powerpc64le-unknown-linux-gnu.  Brace 
> >>> yourselves!
> >>>
> >>> Marek
> >>>
> >>
> >> Just a small note that 510.parest_r SPEC 2017 benchmark can't be built now
> >> with default changed to -std=c++17. The spec config needs to be adjusted.
> >
> > Interesting, do you know why?  Does it use the register keyword?
>
> Apparently it needs -fno-new-ttp-matching for successful compilation.
> There's a reduced test-case I made:
>
> cat fe.ii
> template <int, int> class FiniteElement;
> template <int, int> class DoFHandler;
> class FETools {
>    template <int dim, class InVector, class OutVector, int spacedim>
>    void back_interpolate(const DoFHandler<dim, spacedim> &, const InVector &,
>                          const FiniteElement<dim, spacedim> &, OutVector &);
>    template <int dim, template <int> class DH, class InVector, class 
> OutVector,
>              int spacedim>
>    void back_interpolate(const DH<dim> &, InVector,
>                          const FiniteElement<dim, spacedim> &, OutVector);
> };
> template <int dim, int = dim> class DoFHandler;
> template <int dim, int = dim> class FiniteElement;
> template <int dim, class InVector, class OutVector, int spacedim>
> void FETools::back_interpolate(const DoFHandler<dim, spacedim> &,
>                                 const InVector &,
>                                 const FiniteElement<dim, spacedim> &,
>                                 OutVector &) {}
> template void FETools::back_interpolate(const DoFHandler<3> &, const float &,
>                                          const FiniteElement<3> &, float &);

Hmm, looks like I never sent this.

Further reduced:

template <int N, int M = N> class A;
template <int N, int M> void fn(A<N, M> &) {}
template <int N, template <int> class TT>  void fn(TT<N> &);
template void fn(A<3> &);

This breaks due to the C++17 changes to template template parameters
causing A to now be considered a valid argument for TT; with that
change both function templates are valid candidates, and neither is
more specialized than the other, so it's ambiguous.

There are still some open core issues around these changes.


Jason

Reply via email to