This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21 Core Issues List revision 110b. See http://www.open-std.org/jtc1/sc22/wg21/ for the official list.

2023-01-15


1793. thread_local in explicit specializations

Section: 9.2.2  [dcl.stc]     Status: CD4     Submitter: Mike Herrick     Date: 2013-10-02

[Moved to DR at the November, 2014 meeting.]

According to 9.2.2 [dcl.stc] paragraph 1,

...If thread_local appears in any declaration of a variable it shall be present in all declarations of that entity... A storage-class-specifier shall not be specified in an explicit specialization (13.9.4 [temp.expl.spec]) or an explicit instantiation (13.9.3 [temp.explicit]) directive.

These two requirements appear to be in conflict when an explicit instantiation or explicit specialization names a thread_local variable. For example,

  template <class T> struct S {
    thread_local static int tlm;
  };
  template <> int S<int>::tlm = 0;
  template <> thread_local int S<float>::tlm = 0;

which of the two explicit specializations is correct?

Proposed resolution (February, 2014):

Change 9.2.2 [dcl.stc] paragraph 1 as follows:

...A storage-class-specifier other than thread_local shall not be specified in an explicit specialization (13.9.4 [temp.expl.spec]) or an explicit instantiation (13.9.3 [temp.explicit]) directive.