[PATCH] Fix ODR violations in code using <ext/atomicity.h>

Jonathan Wakely jwakely@redhat.com
Fri Jun 21 16:01:00 GMT 2019


Nathan noticed that the 'static inline' functions in <ext/atomicity.h>
cause ODR violations when used from inline functions or templates (see
[basic.def.odr] p12 bullet (12.2)). His modules branch now diagnoses
those violations, so we need a fix.

Looking at the history (r114044 by Paolo) I believe the idea was indeed
to allow different definitions to be used in different TUs. I think
__attribute__((__always_inline__)) is a better match for that than
'static inline', and doesn't violate the ODR (at least, not if all TUs
have the same values for __GTHREADS and _GLIBCXX_ATOMIC_BUILTINS).

These functions still violate this rule in [dcl.inline]:

C++17: "If a function with external linkage is declared inline in one
translation unit, it shall be declared inline in all translation units
in which it appears; no diagnostic is required."

C++2a WP: "If a function or variable with external or module linkage
is declared inline in one translation unit, there shall be a reachable
inline declaration in all translation units in which it is declared;
no diagnostic is required."

But that doesn't seem to be diagnosable by today's implementations.

Does this change seem reasonable?

It does change the size of a few files, e.g. for x86_64 some are
bigger and some are smaller, overall slightly smaller:

   text	   data	    bss	    dec	    hex	filename

   5400	      8	    352	   5760	   1680	src/c++11/cow-locale_init.o
   5402	      8	    352	   5762	   1682	src/c++11/cow-locale_init.o [always_inline]

  22772	   2056	      0	  24828	   60fc	src/c++11/cow-shim_facets.o
  22710	   2056	      0	  24766	   60be	src/c++11/cow-shim_facets.o [always_inline]

  49458	   2184	      0	  51642	   c9ba	src/c++11/cow-sstream-inst.o
  49482	   2184	      0	  51666	   c9d2	src/c++11/cow-sstream-inst.o [always_inline]

   7461	      8	      0	   7469	   1d2d	src/c++11/cow-stdexcept.o
   7464	      8	      0	   7472	   1d30	src/c++11/cow-stdexcept.o [always_inline]

  16753	      8	     32	  16793	   4199	src/c++11/cow-string-inst.o
  16756	      8	     32	  16796	   419c	src/c++11/cow-string-inst.o [always_inline]

  17009	      8	     32	  17049	   4299	src/c++11/cow-wstring-inst.o
  17008	      8	     32	  17048	   4298	src/c++11/cow-wstring-inst.o [always_inline]

  20342	   2072	      0	  22414	   578e	src/c++11/cxx11-shim_facets.o
  20276	   2072	      0	  22348	   574c	src/c++11/cxx11-shim_facets.o [always_inline]

   2929	    240	      8	   3177	    c69	src/c++11/future.o
   2945	    240	      8	   3193	    c79	src/c++11/future.o [always_inline]

   6789	    120	      0	   6909	   1afd	src/c++11/ios-inst.o
   6750	    120	      0	   6870	   1ad6	src/c++11/ios-inst.o [always_inline]

   2364	     57	      8	   2429	    97d	src/c++11/ios.o
   2362	     57	      8	   2427	    97b	src/c++11/ios.o [always_inline]

  94493	   2712	    192	  97397	  17c75	src/c++11/locale-inst.o
  94498	   2712	    192	  97402	  17c7a	src/c++11/locale-inst.o [always_inline]

  93094	   2712	    192	  95998	  176fe	src/c++11/wlocale-inst.o
  93113	   2712	    192	  96017	  17711	src/c++11/wlocale-inst.o [always_inline]

  20189	    208	      0	  20397	   4fad	src/c++17/cow-fs_dir.o
  20118	    208	      0	  20326	   4f66	src/c++17/cow-fs_dir.o [always_inline]

  55077	      8	      0	  55085	   d72d	src/c++17/cow-fs_ops.o
  55103	      8	      0	  55111	   d747	src/c++17/cow-fs_ops.o [always_inline]

  40200	    304	      0	  40504	   9e38	src/c++17/cow-fs_path.o
  40204	    304	      0	  40508	   9e3c	src/c++17/cow-fs_path.o [always_inline]

  18672	    208	      0	  18880	   49c0	src/c++17/fs_dir.o
  18628	    208	      0	  18836	   4994	src/c++17/fs_dir.o [always_inline]

  60604	    160	      0	  60764	   ed5c	src/c++17/fs_ops.o
  60606	    160	      0	  60766	   ed5e	src/c++17/fs_ops.o [always_inline]

  39568	    304	      0	  39872	   9bc0	src/c++17/fs_path.o
  39561	    304	      0	  39865	   9bb9	src/c++17/fs_path.o [always_inline]

   3653	      8	      0	   3661	    e4d	src/c++98/ios_init.o
   3656	      8	      0	   3664	    e50	src/c++98/ios_init.o [always_inline]

   6878	    184	     84	   7146	   1bea	src/c++98/locale.o
   6896	    184	     84	   7164	   1bfc	src/c++98/locale.o [always_inline]

   6693	    768	   5368	  12829	   321d	src/c++98/locale_init.o
   6710	    768	   5368	  12846	   322e	src/c++98/locale_init.o [always_inline]

   7222	      8	      0	   7230	   1c3e	src/c++98/localename.o
   7223	      8	      0	   7231	   1c3f	src/c++98/localename.o [always_inline]

   4036	    144	    208	   4388	   1124	src/c++98/pool_allocator.o
   4044	    144	    208	   4396	   112c	src/c++98/pool_allocator.o [always_inline]

   1955	    584	      0	   2539	    9eb	src/c++98/stdexcept.o
   1957	    584	      0	   2541	    9ed	src/c++98/stdexcept.o [always_inline]

  25199	    208	      0	  25407	   633f	src/filesystem/cow-dir.o
  25248	    208	      0	  25456	   6370	src/filesystem/cow-dir.o [always_inline]

  71134	      8	      0	  71142	  115e6	src/filesystem/cow-ops.o
  71146	      8	      0	  71154	  115f2	src/filesystem/cow-ops.o [always_inline]

  21995	    184	      0	  22179	   56a3	src/filesystem/cow-path.o
  22013	    184	      0	  22197	   56b5	src/filesystem/cow-path.o [always_inline]

  23708	    208	      0	  23916	   5d6c	src/filesystem/dir.o
  23690	    208	      0	  23898	   5d5a	src/filesystem/dir.o [always_inline]

  70268	    160	      0	  70428	  1131c	src/filesystem/ops.o
  70233	    160	      0	  70393	  112f9	src/filesystem/ops.o [always_inline]

 815915   15841    6476  838232   cca58 TOTAL
 815802   15841    6476  838119   cc9e7 TOTAL [always_inline]



-------------- next part --------------
A non-text attachment was scrubbed...
Name: patch.txt
Type: text/x-patch
Size: 2519 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/libstdc++/attachments/20190621/05971851/attachment.bin>


More information about the Libstdc++ mailing list