[Bug c++/108488] New: segfault with -fmodules-ts and class-scope friend declaration first in uninstantiated template

wendellcraigbaker at gmail dot com gcc-bugzilla@gcc.gnu.org
Fri Jan 20 22:42:50 GMT 2023


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

            Bug ID: 108488
           Summary: segfault with -fmodules-ts and class-scope friend
                    declaration first in uninstantiated template
           Product: gcc
           Version: 12.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: wendellcraigbaker at gmail dot com
  Target Milestone: ---

Created attachment 54320
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=54320&action=edit
Complete C++ to exhibit the segfault

The sequence of declarations causes a segfault in gcc 12.2.1 under -fmodules-ts


template <typename> class k;
...more...
struct d {
  ...
  void ck(k<int> const &);
  void ck(int);
};
...more...
template <typename> class k {
  template <typename> friend class ca;
};
...more...
  auto e::operator+=(e &&cl) -> e & {
    for (auto bt : cl)
      ck(bt);
    return *this;
  }
...more...
template <typename> class ca {};
ca<int> d;



It is specific to -fmodules-ts
It is specific to the declaration of friend class ca introduced at class scope.

The exhibition and script show details.


The compiler instance here stock-delivered Fedora 37 GCC 12.2.1 but the problem
exists in older versions and also on trunk.

https://godbolt.org/z/GGP4dxnjY

https://godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:c%2B%2B,selection:(endColumn:1,endLineNumber:34,positionColumn:1,positionLineNumber:34,selectionStartColumn:1,selectionStartLineNumber:34,startColumn:1,startLineNumber:34),source:'class+e%3B%0A%0Atemplate+%3Ctypename%3E+class+k%3B%0A%0Astruct+l+%7B%0A++int+operator*()%3B%0A++void+operator%2B%2B()%3B%0A++friend+bool+operator%3D%3D(l,+l)%3B%0A%7D%3B%0Astruct+d+%7B%0A++l+begin()%3B%0A++l+end()%3B%0A++void+ck(k%3Cint%3E+const+%26)%3B%0A++void+ck(int)%3B%0A%7D%3B%0A%0A%0Aclass+e+:+d+%7B%0A++auto+operator%2B%3D(e+%26%26)+-%3E+e+%26%3B%0A%7D%3B%0Atemplate+%3Ctypename%3E+class+k+%7B%0A++template+%3Ctypename%3E+friend+class+ca%3B%0A%7D%3B%0A%0A++auto+e::operator%2B%3D(e+%26%26cl)+-%3E+e+%26+%7B%0A++++for+(auto+bt+:+cl)%0A++++++ck(bt)%3B%0A++++return+*this%3B%0A++%7D%0A%0A%0Atemplate+%3Ctypename%3E+class+ca+%7B%7D%3B%0A%0Aca%3Cint%3E+d%3B%0A'),l:'5',n:'0',o:'C%2B%2B+source+%231',t:'0')),k:27.194244604316548,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:output,i:(compilerName:'x86-64+clang+3.5',editorid:1,fontScale:14,fontUsePx:'0',j:1,wrap:'1'),l:'5',n:'0',o:'Output+of+x86-64+gcc+(trunk)+(Compiler+%231)',t:'0')),header:(),k:47.805755395683455,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:gsnapshot,deviceViewOpen:'1',filters:(b:'0',binary:'1',binaryObject:'1',commentOnly:'0',demangle:'0',directives:'0',execute:'1',intel:'0',libraryCode:'0',trim:'1'),flagsViewOpen:'1',fontScale:14,fontUsePx:'0',j:1,lang:c%2B%2B,libs:!(),options:'-std%3Dc%2B%2B23+-fmodules-ts',selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:1),l:'5',n:'0',o:'+x86-64+gcc+(trunk)+(Editor+%231)',t:'0')),k:25,l:'4',n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4


On goldbolt.org, against trunk, the error messaging is:

'
tree check: expected class 'type', have 'declaration' (type_decl) in
get_originating_module_decl, at cp/module.cc:18634
   32 | template <typename> class ca {};
      |                           ^~
0x23aef7e internal_error(char const*, ...)
        ???:0
0x939ce7 tree_class_check_failed(tree_node const*, tree_code_class, char
const*, int, char const*)
        ???:0
0xbc4c9b get_originating_module(tree_node*, bool)
        ???:0
0x23ce58c pp_format(pretty_printer*, text_info*)
        ???:0
0x23cf79d pp_format_verbatim(pretty_printer*, text_info*)
        ???:0
0x23cf885 pp_verbatim(pretty_printer*, char const*, ...)
        ???:0
0x23ad925 diagnostic_report_diagnostic(diagnostic_context*, diagnostic_info*)
        ???:0
0x23aef7e internal_error(char const*, ...)
        ???:0
0x939ce7 tree_class_check_failed(tree_node const*, tree_code_class, char
const*, int, char const*)
        ???:0
0xbc4c9b get_originating_module(tree_node*, bool)
        ???:0
0xb6f28c decl_as_string(tree_node*, int)
        ???:0
0xb6f2c3 decl_as_dwarf_string(tree_node*, int)
        ???:0
0x1220e3c rest_of_type_compilation(tree_node*, int)
        ???:0
0xabf59e finish_struct_1(tree_node*)
        ???:0
0xca51c0 instantiate_class_template(tree_node*)
        ???:0
0xb258f3 start_decl_1(tree_node*, bool)
        ???:0
0xb48077 start_decl(cp_declarator const*, cp_decl_specifier_seq*, int,
tree_node*, tree_node*, tree_node**)
        ???:0
0xc4e137 c_parse_file()
        ???:0
0xd89ad9 c_common_parse_file()
        ???:0
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.
Compiler returned: 1


More information about the Gcc-bugs mailing list