#995757 module: inline class member function cannot use an extern thread_local int

Package:
g++-11
Source:
gcc-11
Description:
GNU C++ compiler
Submitter:
Frank Brokken
Date:
2021-10-05 08:00:04 UTC
Severity:
normal
#995757#5
Date:
2021-10-05 07:56:27 UTC
From:
To:
Dear Maintainer,

   * What led up to the situation?

While developing a module whose interface declares an extern thread_local int
and a class whose member accesses that int the compiler produces an internal
compiler error. The bug is observed when the member's implementation is
provided as an inline function, below the interface. If either instead of
'extern thread_local int' an 'extern int' is declared or if instead of an
inline function the function's implementation is provided in-class the
compiler bug isn't observed.

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

Here's the demo source:
--------------------------------
/*
    Define not THREAD_LOCAL and not INCLASS:    no error
    Define not THREAD_LOCAL and INCLASS:        no error
    Define THTREAD_LOCAL and not INCLASS:       internal compiler error
    Define THTREAD_LOCAL and INCLASS:           no  error
*/

#define THREAD_LOCAL
#define INCLASS

module;

#include <thread>

export module DemoMod;

export
{
    #ifdef THREAD_LOCAL
        extern thread_local int g_errno;
    #else
        extern int g_errno;
    #endif

    struct Demo
    {
        #ifdef INCLASS
            void member()
            {
                g_errno = 0;
            }
        #else
            void member();
        #endif

    };

    #ifndef INCLASS
        inline void Demo::member()
        {
            g_errno = 0;
        }
    #endif

}   // end export block
-------------------------------- * What was the outcome of this action? If INCLASS is not defined then the compiler produces the following bugreport:
-------------------------------- demo.cc:15:8: internal compiler error: in tree_node, at cp/module.cc:9061 15 | export module DemoMod; | ^~~~~~ 0x9d4646 trees_out::tree_node(tree_node*) ../../src/gcc/cp/module.cc:9061 0x9d29fa trees_out::core_vals(tree_node*) ../../src/gcc/cp/module.cc:5915 0x9d313e trees_out::tree_node_vals(tree_node*) ../../src/gcc/cp/module.cc:7056 0x9d5aff trees_out::tree_value(tree_node*) ../../src/gcc/cp/module.cc:8892 0x9d466d trees_out::tree_node(tree_node*) ../../src/gcc/cp/module.cc:9090 0x9d29fa trees_out::core_vals(tree_node*) ../../src/gcc/cp/module.cc:5915 0x9d313e trees_out::tree_node_vals(tree_node*) ../../src/gcc/cp/module.cc:7056 0x9d5aff trees_out::tree_value(tree_node*) ../../src/gcc/cp/module.cc:8892 0x9d466d trees_out::tree_node(tree_node*) ../../src/gcc/cp/module.cc:9090 0x9d29fa trees_out::core_vals(tree_node*) ../../src/gcc/cp/module.cc:5915 0x9d313e trees_out::tree_node_vals(tree_node*) ../../src/gcc/cp/module.cc:7056 0x9d5aff trees_out::tree_value(tree_node*) ../../src/gcc/cp/module.cc:8892 0x9d466d trees_out::tree_node(tree_node*) ../../src/gcc/cp/module.cc:9090 0x9d29fa trees_out::core_vals(tree_node*) ../../src/gcc/cp/module.cc:5915 0x9d313e trees_out::tree_node_vals(tree_node*) ../../src/gcc/cp/module.cc:7056 0x9d5aff trees_out::tree_value(tree_node*) ../../src/gcc/cp/module.cc:8892 0x9d466d trees_out::tree_node(tree_node*) ../../src/gcc/cp/module.cc:9090 0x9d29fa trees_out::core_vals(tree_node*) ../../src/gcc/cp/module.cc:5915 0x9d313e trees_out::tree_node_vals(tree_node*) ../../src/gcc/cp/module.cc:7056 0x9d5aff trees_out::tree_value(tree_node*) ../../src/gcc/cp/module.cc:8892 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See <file:///usr/share/doc/gcc-11/README.Bugs> for instructions. -------------------------------- * What outcome did you expect instead? I would have expected that the compiler would correctly compile the source file for all four combinations of defining THREAD_LOCAL and INCLASS