[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/gcc-patches/attachments/20190621/05971851/attachment.bin>
More information about the Gcc-patches
mailing list