[llvm-bugs] [Bug 33371] New: undefined symbol when linking code that uses vector header

via llvm-bugs llvm-bugs at lists.llvm.org
Thu Jun 8 17:33:38 PDT 2017


https://bugs.llvm.org/show_bug.cgi?id=33371

            Bug ID: 33371
           Summary: undefined symbol when linking code that uses vector
                    header
           Product: libc++
           Version: unspecified
          Hardware: PC
                OS: All
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: All Bugs
          Assignee: unassignedclangbugs at nondot.org
          Reporter: michaeljclark at mac.com
                CC: llvm-bugs at lists.llvm.org, mclow.lists at gmail.com

Created attachment 18601
  --> https://bugs.llvm.org/attachment.cgi?id=18601&action=edit
inline exceptions in __vector_base_common

The following link error occurs when linking code that uses std::vector

Undefined symbols for architecture x86_64:
  "std::__1::__vector_base_common<true>::__throw_length_error() const",
referenced from:
  <snip>

It appears that the header violates ODR? It is unusual to have out of line
function bodies declared in a template header. I'm not sure of the rationale of
having these out of line, and if so they should be declared in src/vector.cpp.
The attached patch solves the problem.

--- a/include/vector
+++ b/include/vector
@@ -290,24 +290,16 @@ class __vector_base_common
 {
 protected:
     _LIBCPP_ALWAYS_INLINE __vector_base_common() {}
-    _LIBCPP_NORETURN void __throw_length_error() const;
-    _LIBCPP_NORETURN void __throw_out_of_range() const;
+    _LIBCPP_NORETURN _LIBCPP_ALWAYS_INLINE void __throw_length_error() const
+    {
+        _VSTD::__throw_length_error("vector");
+    }
+    _LIBCPP_NORETURN _LIBCPP_ALWAYS_INLINE void __throw_out_of_range() const
+    {
+        _VSTD::__throw_out_of_range("vector");
+    }
 };

-template <bool __b>
-void
-__vector_base_common<__b>::__throw_length_error() const
-{
-    _VSTD::__throw_length_error("vector");
-}
-
-template <bool __b>
-void
-__vector_base_common<__b>::__throw_out_of_range() const
-{
-    _VSTD::__throw_out_of_range("vector");
-}
-
 #ifdef _LIBCPP_MSVC
 #pragma warning( push )
 #pragma warning( disable: 4231 )

-- 
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/20170609/563407d4/attachment-0001.html>


More information about the llvm-bugs mailing list