[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#985214: g++-11 internal error and fails to precompile a concept



Package: g++-11
Version: 11-20210306-1
Severity: normal

Dear Maintainer,

   * What led up to the situation?

Following the installation of g++-11 a previously precompilable header file
can't be precompiled anymore, and in some cases the compiler reports an
internal error requesting to submit a bug report.

   * What exactly did you do (or not do) that was effective (or
     ineffective)?

After upgrading g++ to version 11.0.1 the compiler reports a problem when
precompiling the following header file (shown between the ----------
lines). Additional information is provided below the next *-ed question.

--------------------------------------
#ifndef INCLUDED_CSVTABINS_
#define INCLUDED_CSVTABINS_

// #include <ostream> instead of iosfwd makes no difference
#include <iosfwd>

template <typename Type>
concept OstreamInsertable = 
    requires(std::ostream &out, Type value)
    {
        out << value;
    };

// when using typename instead of the above concept : no error    (1)
// e.g., by activating the following #define
// #define OstreamInsertable typename

struct FMT
{
    enum Align
    {};
    
    typedef FMT (*FMTFun)(unsigned, unsigned);
    typedef FMT (*FMTHline)(unsigned);
};

class CSVTabIns
{
    template <OstreamInsertable Type>
    friend void operator<<(CSVTabIns &tab, Type const &value);    

// when omitted: results in bugreport1                              (2)
    friend CSVTabIns &operator<<(CSVTabIns &tab, FMT const &fmt);       

    friend void operator<<(CSVTabIns &tab, FMT::FMTHline);        
};

// when defined here: precompilation error                          (3)
template <OstreamInsertable Type>
inline void operator<<(CSVTabIns &&tab, Type const &value)
{}

inline void operator<<(CSVTabIns &tab, FMT::FMTHline hline)
{
    // when the insertion is omitted: no precompilation error
    tab << (*hline)(1);      // insert hline in the next column
}

// when defined here: no precompilation error                       (4)
//template <OstreamInsertable Type>
//inline void operator<<(CSVTabIns &&tab, Type const &value)
//{}

#endif
--------------------------------------


   * What was the outcome of this action?

Points to note (see the (x) marked comment entries:

    1: If the concept isn't used, but instead of using
            'template <OstreamOstreamInsertable Type>'
        the plain template header
            'template <typename Type>'
        is used compilation completes flawlessly.

        Also, when using version 
            g++-10 (Debian 10.2.1-6) 10.2.1 20210110
        no problem is reported.


        With g++-11 the received error message is:

csvtabins: In substitution of ‘template<class Type>  requires  OstreamOstreamInsertable<Type> void operator<<(CSVTabIns&&, const Type&) [with Type = FMT]’:
csvtabins:11:13:   required by substitution of ‘template<class Type>  requires  OstreamOstreamInsertable<Type> void operator<<(CSVTabIns&, const Type&) [with Type = FMT]’
csvtabins:45:22:   required from here
csvtabins:8:9:   required for the satisfaction of ‘OstreamOstreamInsertable<Type>’ [with Type = FMT]
csvtabins:9:5:   in requirements with ‘std::ostream& out’, ‘Type value’ [with Type = FMT]
csvtabins:9:5: error: satisfaction of atomic constraint ‘requires(std::ostream& out, Type value) {out << value;} [with Type = Type]’ depends on itself
    9 |     requires(std::ostream &out, Type value)
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   10 |     {
      |     ~
   11 |         out << value;
      |         ~~~~~~~~~~~~~
   12 |     };
      |     ~

        which, I'm afraid, doesn't help me to understand the nature of the
        problem. In particular it's unclear what is meant by 'satisfaction of
        atomic constraint ...  depends on itself'.

    2: When the friend declaration below (2) is omitted, the compiler reports
        an internal error requesting to submit a bug-report.
        In particular, the compiler reports:

csvtabins:11:13: internal compiler error: in get, at cp/constraint.cc:2656
   11 |         out << value;
...
0xc84ae6 tsubst_simple_requirement
        ../../src/gcc/cp/constraint.cc:1983
Please submit a full bug report,
with preprocessed source if appropriate.

        To reduce the size of this bug-report: the compiler's full output can
be retrieved from 'https://www.icce.rug.nl/tmp/bugreport1'. The precompiled
header produced by the compiler when it generated bugreport1 can be retrieved
from 'https://www.icce.rug.nl/tmp/bugreport1-csvtabins.gch'.

    When instead of g++-11 g++-10 (Debian 10.2.1-6) 10.2.1 20210110) is used
then no internal error emerges, but just a normal error about a missing
operator<<. E.g.:

csvtabins: In function ‘void operator<<(CSVTabIns&, FMT::FMTHline)’:
csvtabins:45:9: error: no match for ‘operator<<’ (operand types are ‘CSVTabIns’ and ‘FMT’)
   45 |     tab << (*hline)(1);      // insert hline in the next column
      |     ~~~ ^~ ~~~~~~~~~~~
      |     |              |
      |     CSVTabIns      FMT
    ...


    3 and 4: Whether the compilation error is encountered or not depends on the
        position of the 
            template <OstreamInsertable Type>
            inline void operator<<(CSVTabIns &&tab, Type const &value)
            {}
        template definition. When it's defined below (3) the error is
        encountered, when it's defined below (4) compilation succeeds without
        error. 

   * What outcome did you expect instead?

    The same as with g++-10: no errors. 

    Also, the meaning of the displayed compilation error (satisfaction of
atomic constraint 'requires(std::ostream& out, Type value) {out << value;}
[with Type = Type]' depends on itself) is (at least to me) unclear, and
doesn't provide me with any hint about how to fix the problem.


-- System Information:
Debian Release: bullseye/sid
  APT prefers testing
  APT policy: (500, 'testing'), (1, 'experimental')
Architecture: amd64 (x86_64)

Kernel: Linux 5.10.0-3-amd64 (SMP w/4 CPU threads)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), LANGUAGE=en_US:en
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

Versions of packages g++-11 depends on:
ii  gcc-11            11-20210306-1
ii  gcc-11-base       11-20210306-1
ii  libc6             2.31-9
ii  libgmp10          2:6.2.1+dfsg-1
ii  libisl23          0.23-1
ii  libmpc3           1.2.0-1
ii  libmpfr6          4.1.0-3
ii  libstdc++-11-dev  11-20210306-1
ii  libzstd1          1.4.8+dfsg-2
ii  zlib1g            1:1.2.11.dfsg-2

g++-11 recommends no packages.

Versions of packages g++-11 suggests:
pn  g++-11-multilib  <none>
pn  gcc-11-doc       <none>

-- no debconf information

Reply to: