Address "always inline function is not always inlinable" warning with GCC.
authorEric Fiselier <eric@efcs.ca>
Tue, 17 Jul 2018 05:48:48 +0000 (05:48 +0000)
committerEric Fiselier <eric@efcs.ca>
Tue, 17 Jul 2018 05:48:48 +0000 (05:48 +0000)
When an always_inline function is used prior to the functions definition,
the compiler may not be able to inline it as requested by the attribute.
GCC flags the `basic_string(CharT const*)` function as one such example.

This patch supresses the warning, and the problem, by moving the
definition of the string constructor to the inline declaration.
This ensures the body is available when it is first ODR used.

llvm-svn: 337235

libcxx/include/string

index 96d36f4f7f4af6cb5fcd78b6390fe3f288ae2284..162e54058c4263225ceb2e6948a247fe6403e0ed 100644 (file)
@@ -807,8 +807,14 @@ public:
 #endif  // _LIBCPP_CXX03_LANG
 
     template <class = typename enable_if<__is_allocator<_Allocator>::value, nullptr_t>::type>
-        _LIBCPP_INLINE_VISIBILITY
-        basic_string(const _CharT* __s);
+    _LIBCPP_INLINE_VISIBILITY
+    basic_string(const _CharT* __s) {
+      _LIBCPP_ASSERT(__s != nullptr, "basic_string(const char*) detected nullptr");
+      __init(__s, traits_type::length(__s));
+#   if _LIBCPP_DEBUG_LEVEL >= 2
+      __get_db()->__insert_c(this);
+#   endif
+    }
 
     template <class = typename enable_if<__is_allocator<_Allocator>::value, nullptr_t>::type>
         _LIBCPP_INLINE_VISIBILITY
@@ -1773,17 +1779,6 @@ basic_string<_CharT, _Traits, _Allocator>::__init(const value_type* __s, size_ty
     traits_type::assign(__p[__sz], value_type());
 }
 
-template <class _CharT, class _Traits, class _Allocator>
-template <class>
-basic_string<_CharT, _Traits, _Allocator>::basic_string(const _CharT* __s)
-{
-    _LIBCPP_ASSERT(__s != nullptr, "basic_string(const char*) detected nullptr");
-    __init(__s, traits_type::length(__s));
-#if _LIBCPP_DEBUG_LEVEL >= 2
-    __get_db()->__insert_c(this);
-#endif
-}
-
 template <class _CharT, class _Traits, class _Allocator>
 template <class>
 basic_string<_CharT, _Traits, _Allocator>::basic_string(const _CharT* __s, const _Allocator& __a)