@file and @headername directives
Jonathan Wakely
jwakely.gcc@gmail.com
Sun Aug 18 12:16:57 GMT 2024
On Sun, 18 Aug 2024 at 11:54, Kim Gräsman <kim.grasman@gmail.com> wrote:
>
> Hello,
>
> I maintain the include-what-you-use (IWYU) tool, used to analyze and fix up #include directives in user code to pull in the right header for every used symbol. See https://github.com/include-what-you-use/include-what-you-use for more information.
>
> One of the challenges is private/internal/detail headers where e.g. a symbol X is defined in header bits/x.h, but the documented header to use is actually public/x.h. IWYU has had (for a long time) some heuristic automatic mapping that parses the @file and @headername directives from libstdc++ headers and uses them to redirect any #include of the @file name to the @headername name(s).
>
> I've been playing with improving that mapping, so I've done some analysis of the libstdc++ directives. Attached at the end is the output of some crude diagnostic check I added to IWYU. It's not perfect, but the general patterns show nicely:
>
> * @file sometimes does not have a filename
Doxygen figures out the filename in most cases, so @filename isn't needed.
> * @file sometimes has a filename distinct from the file it's actually in
Which cases below? Do you mean the "include/algorithm" ones?
That is part of the actual filename though, so it's not distinct.
Doxygen is run on the build tree, not the source tree, and so the
headers such as include/std/foo are symlinked to include/foo, so the
@filename is correct.
> * @file often has a spurious "include/" before the filename
IIRC it's needed in some cases, to disambiguate include/foo from
include/ext/foo or include/tr2/foo
> * @headername sometimes refer to files that don't exist
I think ext/type_traits should be ext/type_traits.h so that one's just a bug.
> I've built some heuristic fixups to handle these inconsistencies for better mappings, but I wonder if you would be interested in patches to canonicalize these directives in libstdc++ for the future? Do you have any tooling that uses them?
Yes, they're used by Doxygen to generate the API docs. The @headername
macro is expanded by an alias in the user.cfg doxyfile.
> I realize there's no guarantees for correctness these comment pragmas, but they seem to be used consistently enough that it might be nice to clean them up.
>
> Thanks,
> - Kim
>
> --
> # include-what-you-use over a .cc file including all headers without extension from /usr/include/c++/11
> /usr/include/c++/11/algorithm:51:10: warning: @file directive does not match actual filename: include/algorithm vs. algorithm
This check seems wrong (it does match the last two components of the
filename) and is needed to disambiguate <algorithm> from
<experimental/algorithm>.
> /usr/include/c++/11/utility:51:10: warning: @file directive does not match actual filename: include/utility vs. utility
> /usr/include/c++/11/type_traits:25:10: warning: @file directive does not match actual filename: include/type_traits vs. type_traits
Ditto for these two.
> /usr/include/c++/11/bits/cpp_type_traits.h:27:52: warning: @headername file does not exist: ext/type_traits (/usr/include/c++/11/ext/type_traits)
That seems like a bug.
> /usr/include/c++/11/bits/predefined_ops.h:25:10: warning: @file directive does not match actual filename: predefined_ops.h vs. bits/predefined_ops.h
"predefined_ops.h" is a unique filename, so this is sufficient for
Doxygen to identify it. Adding the bits/ prefix should work too, but
somebody would need to check.
> /usr/include/c++/11/cstdlib:25:10: warning: @file directive does not match actual filename: include/cstdlib vs. cstdlib
Needed to disambiguate <cstdlib> from <tr1/cstdlib>.
> /usr/include/c++/11/bits/std_abs.h:25:10: warning: @file directive does not match actual filename: include/bits/std_abs.h vs. bits/std_abs.h
This isn't "wrong", since it works correctly for Doxygen. I think it
would still work as either bits/std_abs.h or just std_abs.h since that
filename is unique.
> /usr/include/c++/11/any:25:10: warning: @file directive does not match actual filename: include/any vs. any
Needed to disambiguate <any> from <experimental/any>.
> /usr/include/c++/11/array:25:10: warning: @file directive does not match actual filename: include/array vs. array
> /usr/include/c++/11/atomic:25:10: warning: @file directive does not match actual filename: include/atomic vs. atomic
Ditto for these two.
I haven't got time to go through the rest of the warnings now, but
apart from the ext/type_traits.h bug most of them seem like our
Doxygen comments are correct (i.e. working as intended) and your tool
is too picky.
> /usr/include/c++/11/backward/hash_set:51:10: warning: @file directive does not match actual filename: backward/hash_set vs. hash_set
> /usr/include/c++/11/backward/backward_warning.h:23:10: warning: @file directive does not match actual filename: backward/backward_warning.h vs. backward_warning.h
> In file included from all.cc:6:
> In file included from /usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/backward/hash_set:60:
> /usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/backward/backward_warning.h:32:2: warning: This file includes at least one deprecated or antiquated header which may be removed without further notice at a future date. Please use a non-deprecated interface with equivalent functionality instead. For a listing of replacement headers and interfaces, consult the file backward_warning.h. To disable this warning use -Wno-deprecated. [-W#warnings]
> 32 | #warning \
> | ^
> /usr/include/c++/11/backward/hashtable.h:51:10: warning: @file directive does not match actual filename: backward/hashtable.h vs. hashtable.h
> /usr/include/c++/11/vector:51:10: warning: @file directive does not match actual filename: include/vector vs. vector
> /usr/include/c++/11/iterator:51:10: warning: @file directive does not match actual filename: include/iterator vs. iterator
> /usr/include/c++/11/iosfwd:25:10: warning: @file directive does not match actual filename: include/iosfwd vs. iosfwd
> /usr/include/c++/11/cwchar:25:10: warning: @file directive does not match actual filename: include/cwchar vs. cwchar
> /usr/include/c++/11/streambuf:25:10: warning: @file directive does not match actual filename: include/streambuf vs. streambuf
> /usr/include/c++/11/cctype:25:10: warning: @file directive does not match actual filename: include/cctype vs. cctype
> /usr/include/x86_64-linux-gnu/c++/11/bits/atomic_word.h:25:10: warning: @file directive does not match actual filename: atomic_word.h vs. bits/atomic_word.h
> /usr/include/c++/11/string:25:10: warning: @file directive does not match actual filename: include/string vs. string
> /usr/include/c++/11/cwchar:25:10: warning: @file directive does not match actual filename: include/cwchar vs. cwchar
> /usr/include/c++/11/cstdint:25:10: warning: @file directive does not match actual filename: include/cstdint vs. cstdint
> /usr/include/c++/11/backward/binders.h:51:10: warning: @file directive does not match actual filename: backward/binders.h vs. binders.h
> /usr/include/c++/11/cstdlib:25:10: warning: @file directive does not match actual filename: include/cstdlib vs. cstdlib
> /usr/include/c++/11/cwchar:25:10: warning: @file directive does not match actual filename: include/cwchar vs. cwchar
> /usr/include/c++/11/cstdio:25:10: warning: @file directive does not match actual filename: include/cstdio vs. cstdio
> /usr/include/c++/11/system_error:25:10: warning: @file directive does not match actual filename: include/system_error vs. system_error
> /usr/include/c++/11/stdexcept:25:10: warning: @file directive does not match actual filename: include/stdexcept vs. stdexcept
> /usr/include/c++/11/backward/hash_fun.h:51:10: warning: @file directive does not match actual filename: backward/hash_fun.h vs. hash_fun.h
> /usr/include/c++/11/ios:25:10: warning: @file directive does not match actual filename: include/ios vs. ios
> /usr/include/c++/11/cwctype:25:10: warning: @file directive does not match actual filename: include/cwctype vs. cwctype
> /usr/include/c++/11/cctype:25:10: warning: @file directive does not match actual filename: include/cctype vs. cctype
> /usr/include/c++/11/istream:29:10: warning: @file directive does not match actual filename: include/istream vs. istream
> /usr/include/c++/11/ostream:25:10: warning: @file directive does not match actual filename: include/ostream vs. ostream
> /usr/include/c++/11/barrier:34:10: warning: @file directive does not match actual filename: include/barrier vs. barrier
> /usr/include/c++/11/bit:25:10: warning: @file directive does not match actual filename: include/bit vs. bit
> /usr/include/c++/11/bitset:38:10: warning: @file directive does not match actual filename: include/bitset vs. bitset
> /usr/include/c++/11/ccomplex:25:10: warning: @file directive does not match actual filename: include/ccomplex vs. ccomplex
> /usr/include/c++/11/complex:25:10: warning: @file directive does not match actual filename: include/complex vs. complex
> /usr/include/c++/11/cmath:25:10: warning: @file directive does not match actual filename: include/cmath vs. cmath
> /usr/include/c++/11/sstream:25:10: warning: @file directive does not match actual filename: include/sstream vs. sstream
> /usr/include/c++/11/cctype:25:10: warning: @file directive does not match actual filename: include/cctype vs. cctype
> /usr/include/c++/11/cfenv:25:10: warning: @file directive does not match actual filename: include/cfenv vs. cfenv
> /usr/include/c++/11/cfloat:25:10: warning: @file directive does not match actual filename: include/cfloat vs. cfloat
> /usr/include/c++/11/charconv:25:10: warning: @file directive does not match actual filename: include/charconv vs. charconv
> /usr/include/c++/11/chrono:25:10: warning: @file directive does not match actual filename: include/chrono vs. chrono
> /usr/include/c++/11/ratio:25:10: warning: @file directive does not match actual filename: include/ratio vs. ratio
> /usr/include/c++/11/limits:25:10: warning: @file directive does not match actual filename: include/limits vs. limits
> /usr/include/c++/11/ctime:25:10: warning: @file directive does not match actual filename: include/ctime vs. ctime
> /usr/include/c++/11/cinttypes:25:10: warning: @file directive does not match actual filename: include/cinttypes vs. cinttypes
> /usr/include/c++/11/climits:25:10: warning: @file directive does not match actual filename: include/climits vs. climits
> /usr/include/c++/11/cmath:25:10: warning: @file directive does not match actual filename: include/cmath vs. cmath
> /usr/include/c++/11/codecvt:27:10: warning: @file directive does not match actual filename: include/codecvt vs. codecvt
> /usr/include/c++/11/concepts:25:10: warning: @file directive does not match actual filename: include/concepts vs. concepts
> /usr/include/c++/11/condition_variable:25:10: warning: @file directive does not match actual filename: include/condition_variable vs. condition_variable
> /usr/include/c++/11/bits/shared_ptr.h:44:10: warning: @file directive does not match actual filename: vs. bits/shared_ptr.h
> /usr/include/c++/11/bits/refwrap.h:25:10: warning: @file directive does not match actual filename: include/bits/refwrap.h vs. bits/refwrap.h
> /usr/include/c++/11/bits/invoke.h:25:10: warning: @file directive does not match actual filename: include/bits/invoke.h vs. bits/invoke.h
> /usr/include/c++/11/tuple:25:10: warning: @file directive does not match actual filename: include/tuple vs. tuple
> /usr/include/c++/11/coroutine:25:10: warning: @file directive does not match actual filename: include/coroutine vs. coroutine
> In file included from all.cc:29:
> /usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/coroutine:334:2: error: "the coroutine header requires -fcoroutines"
> 334 | #error "the coroutine header requires -fcoroutines"
> | ^
> /usr/include/c++/11/cstdalign:25:10: warning: @file directive does not match actual filename: include/cstdalign vs. cstdalign
> /usr/include/c++/11/cstdarg:25:10: warning: @file directive does not match actual filename: include/cstdarg vs. cstdarg
> /usr/include/c++/11/cstdbool:25:10: warning: @file directive does not match actual filename: include/cstdbool vs. cstdbool
> /usr/include/c++/11/cstdio:25:10: warning: @file directive does not match actual filename: include/cstdio vs. cstdio
> /usr/include/c++/11/cstdlib:25:10: warning: @file directive does not match actual filename: include/cstdlib vs. cstdlib
> /usr/include/c++/11/ctgmath:25:10: warning: @file directive does not match actual filename: include/ctgmath vs. ctgmath
> /usr/include/c++/11/cmath:25:10: warning: @file directive does not match actual filename: include/cmath vs. cmath
> /usr/include/c++/11/ctime:25:10: warning: @file directive does not match actual filename: include/ctime vs. ctime
> /usr/include/c++/11/cuchar:25:10: warning: @file directive does not match actual filename: include/cuchar vs. cuchar
> /usr/include/c++/11/cwchar:25:10: warning: @file directive does not match actual filename: include/cwchar vs. cwchar
> /usr/include/c++/11/cwchar:25:10: warning: @file directive does not match actual filename: include/cwchar vs. cwchar
> /usr/include/c++/11/cwctype:25:10: warning: @file directive does not match actual filename: include/cwctype vs. cwctype
> /usr/include/c++/11/deque:51:10: warning: @file directive does not match actual filename: include/deque vs. deque
> /usr/include/c++/11/forward_list:25:10: warning: @file directive does not match actual filename: include/forward_list vs. forward_list
> /usr/include/c++/11/list:51:10: warning: @file directive does not match actual filename: include/list vs. list
> /usr/include/c++/11/map:51:10: warning: @file directive does not match actual filename: include/map vs. map
> /usr/include/c++/11/set:51:10: warning: @file directive does not match actual filename: include/set vs. set
> /usr/include/c++/11/unordered_map:25:10: warning: @file directive does not match actual filename: include/unordered_map vs. unordered_map
> /usr/include/c++/11/unordered_set:25:10: warning: @file directive does not match actual filename: include/unordered_set vs. unordered_set
> In file included from all.cc:55:
> /usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/decimal/decimal:230:47: error: unknown machine mode 'SD'
> 230 | typedef float __decfloat32 __attribute__((mode(SD)));
> | ^
> /usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/decimal/decimal:251:5: error: constructor cannot be redeclared
> 251 | decimal32(__decfloat32 __z) : __val(__z) {}
> | ^
> /usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/decimal/decimal:238:14: note: previous definition is here
> 238 | explicit decimal32(float __r) : __val(__r) {}
> | ^
> /usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/decimal/decimal:233:36: error: invalid suffix 'DF' on floating constant
> 233 | decimal32() : __val(0.e-101DF) {}
> | ^
> /usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/decimal/decimal:316:47: error: unknown machine mode 'DD'
> 316 | typedef float __decfloat64 __attribute__((mode(DD)));
> | ^
> /usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/decimal/decimal:337:5: error: constructor cannot be redeclared
> 337 | decimal64(__decfloat64 __z) : __val(__z) {}
> | ^
> /usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/decimal/decimal:324:14: note: previous definition is here
> 324 | explicit decimal64(float __r) : __val(__r) {}
> | ^
> /usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/decimal/decimal:319:36: error: invalid suffix 'dd' on floating constant
> 319 | decimal64() : __val(0.e-398dd) {}
> | ^
> /usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/decimal/decimal:402:48: error: unknown machine mode 'TD'
> 402 | typedef float __decfloat128 __attribute__((mode(TD)));
> | ^
> /usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/decimal/decimal:424:5: error: constructor cannot be redeclared
> 424 | decimal128(__decfloat128 __z) : __val(__z) {}
> | ^
> /usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/decimal/decimal:410:14: note: previous definition is here
> 410 | explicit decimal128(float __r) : __val(__r) {}
> | ^
> /usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/decimal/decimal:405:37: error: invalid suffix 'DL' on floating constant
> 405 | decimal128() : __val(0.e-6176DL) {}
> | ^
> In file included from all.cc:55:
> In file included from /usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/decimal/decimal:492:
> /usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/decimal/decimal.h:127:22: error: invalid suffix 'DF' on floating constant
> 127 | __multiplier = 1.E-1DF;
> | ^
> /usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/decimal/decimal.h:131:26: error: invalid suffix 'DF' on floating constant
> 131 | __multiplier = 1.E1DF;
> | ^
> /usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/decimal/decimal.h:145:22: error: invalid suffix 'DF' on floating constant
> 145 | __multiplier = 1.E-1DF;
> | ^
> /usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/decimal/decimal.h:149:26: error: invalid suffix 'DF' on floating constant
> 149 | __multiplier = 1.E1DF;
> | ^
> /usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/decimal/decimal.h:163:22: error: invalid suffix 'DD' on floating constant
> 163 | __multiplier = 1.E-1DD;
> | ^
> /usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/decimal/decimal.h:167:26: error: invalid suffix 'DD' on floating constant
> 167 | __multiplier = 1.E1DD;
> | ^
> /usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/decimal/decimal.h:181:22: error: invalid suffix 'DD' on floating constant
> 181 | __multiplier = 1.E-1DD;
> | ^
> /usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/decimal/decimal.h:185:26: error: invalid suffix 'DD' on floating constant
> 185 | __multiplier = 1.E1DD;
> | ^
> /usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/decimal/decimal.h:199:22: error: invalid suffix 'DL' on floating constant
> 199 | __multiplier = 1.E-1DL;
> | ^
> fatal error: too many errors emitted, stopping now [-ferror-limit=]
> /usr/include/c++/11/random:25:10: warning: @file directive does not match actual filename: include/random vs. random
> /usr/include/c++/11/cmath:25:10: warning: @file directive does not match actual filename: include/cmath vs. cmath
> /usr/include/c++/11/cstdlib:25:10: warning: @file directive does not match actual filename: include/cstdlib vs. cstdlib
> /usr/include/c++/11/numeric:51:10: warning: @file directive does not match actual filename: include/numeric vs. numeric
> /usr/include/c++/11/memory:39:10: warning: @file directive does not match actual filename: include/memory vs. memory
> /usr/include/c++/11/backward/auto_ptr.h:25:10: warning: @file directive does not match actual filename: backward/auto_ptr.h vs. auto_ptr.h
> /usr/include/c++/11/functional:39:10: warning: @file directive does not match actual filename: include/functional vs. functional
> /usr/include/c++/11/bits/std_function.h:25:10: warning: @file directive does not match actual filename: include/bits/std_function.h vs. bits/std_function.h
> /usr/include/c++/11/future:25:10: warning: @file directive does not match actual filename: include/future vs. future
> /usr/include/c++/11/mutex:25:10: warning: @file directive does not match actual filename: include/mutex vs. mutex
> /usr/include/c++/11/queue:51:10: warning: @file directive does not match actual filename: include/queue vs. queue
> /usr/include/c++/11/thread:25:10: warning: @file directive does not match actual filename: include/thread vs. thread
> /usr/include/c++/11/locale:29:10: warning: @file directive does not match actual filename: include/locale vs. locale
> /usr/include/c++/11/ctime:25:10: warning: @file directive does not match actual filename: include/ctime vs. ctime
> /usr/include/c++/11/regex:25:10: warning: @file directive does not match actual filename: include/regex vs. regex
> /usr/include/c++/11/stack:51:10: warning: @file directive does not match actual filename: include/stack vs. stack
> /usr/include/c++/11/cmath:25:10: warning: @file directive does not match actual filename: include/cmath vs. cmath
> /usr/include/c++/11/ext/hash_map:51:10: warning: @file directive does not match actual filename: backward/hash_map vs. ext/hash_map
> /usr/include/c++/11/ext/hash_set:51:10: warning: @file directive does not match actual filename: backward/hash_set vs. ext/hash_set
> /usr/include/c++/11/cstdlib:25:10: warning: @file directive does not match actual filename: include/cstdlib vs. cstdlib
> /usr/include/x86_64-linux-gnu/c++/11/ext/opt_random.h:25:10: warning: @file directive does not match actual filename: ext/random.tcc vs. ext/opt_random.h
> /usr/include/c++/11/ext/ropeimpl.h:38:10: warning: @file directive does not match actual filename: ropeimpl.h vs. ext/ropeimpl.h
> /usr/include/c++/11/cstdio:25:10: warning: @file directive does not match actual filename: include/cstdio vs. cstdio
> /usr/include/c++/11/filesystem:25:10: warning: @file directive does not match actual filename: include/filesystem vs. filesystem
> /usr/include/c++/11/fstream:25:10: warning: @file directive does not match actual filename: include/fstream vs. fstream
> /usr/include/c++/11/cstdio:25:10: warning: @file directive does not match actual filename: include/cstdio vs. cstdio
> /usr/include/c++/11/cstdio:25:10: warning: @file directive does not match actual filename: include/cstdio vs. cstdio
> /usr/include/c++/11/iomanip:25:10: warning: @file directive does not match actual filename: include/iomanip vs. iomanip
> /usr/include/c++/11/iostream:25:10: warning: @file directive does not match actual filename: include/iostream vs. iostream
> /usr/include/c++/11/latch:25:10: warning: @file directive does not match actual filename: include/latch vs. latch
> /usr/include/c++/11/memory_resource:25:10: warning: @file directive does not match actual filename: include/memory_resource vs. memory_resource
> /usr/include/c++/11/numbers:25:10: warning: @file directive does not match actual filename: include/numbers vs. numbers
> /usr/include/c++/11/optional:25:10: warning: @file directive does not match actual filename: include/optional vs. optional
> /usr/include/c++/11/cstdlib:25:10: warning: @file directive does not match actual filename: include/cstdlib vs. cstdlib
> /usr/include/c++/11/cstdio:25:10: warning: @file directive does not match actual filename: include/cstdio vs. cstdio
> /usr/include/c++/11/cmath:25:10: warning: @file directive does not match actual filename: include/cmath vs. cmath
> /usr/include/c++/11/cstdio:25:10: warning: @file directive does not match actual filename: include/cstdio vs. cstdio
> /usr/include/c++/11/cstdlib:25:10: warning: @file directive does not match actual filename: include/cstdlib vs. cstdlib
> /usr/include/c++/11/cmath:25:10: warning: @file directive does not match actual filename: include/cmath vs. cmath
> /usr/include/c++/11/ranges:25:10: warning: @file directive does not match actual filename: include/ranges vs. ranges
> /usr/include/c++/11/scoped_allocator:25:10: warning: @file directive does not match actual filename: include/scoped_allocator vs. scoped_allocator
> /usr/include/c++/11/semaphore:25:10: warning: @file directive does not match actual filename: include/semaphore vs. semaphore
> /usr/include/c++/11/shared_mutex:25:10: warning: @file directive does not match actual filename: include/shared_mutex vs. shared_mutex
> /usr/include/c++/11/source_location:25:10: warning: @file directive does not match actual filename: include/source_location vs. source_location
> /usr/include/c++/11/stop_token:25:10: warning: @file directive does not match actual filename: include/stop_token vs. stop_token
> /usr/include/c++/11/string_view:25:10: warning: @file directive does not match actual filename: include/string_view vs. string_view
> /usr/include/c++/11/syncstream:25:10: warning: @file directive does not match actual filename: include/syncstream vs. syncstream
> /usr/include/c++/11/cctype:25:10: warning: @file directive does not match actual filename: include/cctype vs. cctype
> /usr/include/c++/11/cfloat:25:10: warning: @file directive does not match actual filename: include/cfloat vs. cfloat
> /usr/include/c++/11/climits:25:10: warning: @file directive does not match actual filename: include/climits vs. climits
> /usr/include/c++/11/cstdarg:25:10: warning: @file directive does not match actual filename: include/cstdarg vs. cstdarg
> /usr/include/c++/11/cstdio:25:10: warning: @file directive does not match actual filename: include/cstdio vs. cstdio
> /usr/include/c++/11/cstdlib:25:10: warning: @file directive does not match actual filename: include/cstdlib vs. cstdlib
> /usr/include/c++/11/ctime:25:10: warning: @file directive does not match actual filename: include/ctime vs. ctime
> /usr/include/c++/11/cwchar:25:10: warning: @file directive does not match actual filename: include/cwchar vs. cwchar
> /usr/include/c++/11/cwctype:25:10: warning: @file directive does not match actual filename: include/cwctype vs. cwctype
> /usr/include/c++/11/typeindex:25:10: warning: @file directive does not match actual filename: include/typeindex vs. typeindex
> /usr/include/c++/11/valarray:25:10: warning: @file directive does not match actual filename: include/valarray vs. valarray
> /usr/include/c++/11/cmath:25:10: warning: @file directive does not match actual filename: include/cmath vs. cmath
> /usr/include/c++/11/cstdlib:25:10: warning: @file directive does not match actual filename: include/cstdlib vs. cstdlib
More information about the Libstdc++
mailing list