Compile this with current 4.1 branch (verified with 4.1.2 20060710):

% cat one.ii
template <typename T>
struct One {
  static const int A;
};
template <typename T>
const int One<T>::A = 5;
int f()
{
  return One<int>::A;
}
% ./gcc/cc1plus one.ii && gcc -c one.s && nm one.o | c++filt
         U __gxx_personality_v0
00000000 T f()
00000000 D _ZN3OneIT_E1AE

(strangely enough the name _ZN3OneIT_E1AE can't be demangled, but that's
secondary).

The important point is that this is a template member, which is not defined 
as weak or linkonce symbol.  This breaks when the template is instantiated
in multiple .o files (it occurred while compiling obby).

Interestingly it depends on the member being marked "const".  Without it
the symbols look right:
00000000 V One<int>::A

With 4.1.0 this generated no .data objects at all (presumably by optimizing
away all references to it, by using the constness), and hence no symbol
conflicts, so something changed till 4.1.0.


-- 
           Summary: const static members generate .data defs
           Product: gcc
           Version: 4.1.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: matz at gcc dot gnu dot org
  GCC host triplet: i386-linux


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28327

Reply via email to