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

Bug#985214: marked as done (g++-11 internal error and fails to precompile a concept)



Your message dated Wed, 14 Jul 2021 09:06:39 +0200
with message-id <1b3eb729-40b0-7550-61ce-c08a6a5dc0a9@debian.org>
and subject line Re: g++-11 internal error and fails to precompile a concept
has caused the Debian Bug report #985214,
regarding g++-11 internal error and fails to precompile a concept
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
985214: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=985214
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---
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

--- End Message ---
--- Begin Message ---
closing, the original error is gone.

--- End Message ---

Reply to: