[LLVMbugs] [Bug 20825] New: "extern template" seems to invoke explicit instanciation but it should prohibit it.

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Mon Sep 1 04:37:03 PDT 2014


http://llvm.org/bugs/show_bug.cgi?id=20825

            Bug ID: 20825
           Summary: "extern template" seems to invoke explicit
                    instanciation but it should prohibit it.
           Product: clang
           Version: trunk
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: C++11
          Assignee: unassignedclangbugs at nondot.org
          Reporter: gw.fossdev at gmail.com
                CC: dgregor at apple.com, llvmbugs at cs.uiuc.edu
    Classification: Unclassified

Created attachment 12967
  --> http://llvm.org/bugs/attachment.cgi?id=12967&action=edit
A simple test case to illustrate the problem.

If I understood N1448 of the C++11 standard correctly, then "extern template"
should inhibit (implicite) instansiation. However, diagnostics now tell me that
explicit instantiation is actually invoked, inhibiting to partially specialize
static member variables. 

The test case given below issues the following disgnostics with 

Debian clang version 3.5.0-+rc1-2 (tags/RELEASE_35/rc1) (based on LLVM 3.5.0)

==============

testcase.cc:12:34: error: explicit specialization of 'info' after instantiation
template <> const char * A<int>::info = "This is int"; 
                                 ^
testcase.cc:9:23: note: explicit instantiation first required here
extern template class A<int>; 
                      ^
testcase.cc:13:35: error: explicit specialization of 'info' after instantiation
template <> const char * A<char>::info = "This is char"; 
                                  ^
testcase.cc:10:23: note: explicit instantiation first required here
extern template class A<char>; 
                      ^
2 errors generated.
=============

g++ (4.9) compiles and links this code fine. 

In the code that made me aware of the problem the "extern template" is of
course located in a header file, and hence the specialization can not be added
before the "extern template" because it results in multiple definitions at link
time. On the other hand, using "extern template" is required to enforce
visibility attributes. 

Many thanks.

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20140901/473c822f/attachment.html>


More information about the llvm-bugs mailing list