gcc-13 was released with -Wextra implying -Wdangling-reference, but
-Wdangling-reference as released warns on cases that are safe. Add a
configure test to detect when the compiler warns incorrectly, and
disable the warning in those cases. When a future compiler emits fewer
false positives, the suppression of the warning should stop.
Reported-by: ziplantil <https://github.com/dxx-rebirth/dxx-rebirth/issues/718>
Prefer creating a copy explicitly, then appending or extending it as
needed, rather than using `__add__` and allowing it to duplicate the
sequence. `__add__` has two undesirable properties in this script:
- Using `A + B + C` can create multiple temporaries unnecessarily.
- `A + B` typically requires that `A` and `B` be the same type of
sequence, but this script does not need to require that. Using an
explicit copy+extend allows `A` and `B` to be different types of
sequence.
Make use of the latter property to turn some member variables that were
`list` for the sake of `__add__`'s type requirement into `tuple`, since
they are never rewritten.
The link line is not used by clang, but is recorded in the hope that it
is useful for other tools. Stabilize the output by requesting the
`str`, not the `repr`, of the input nodes. `repr` in scons-4.4
generates a bare Python repr, rather than any useful text. In addition
to not being useful, the bare repr exposes the memory address of the
`SCons.Node.FS.File`, which can vary from run to run even with no
changes to the code, causing needless rebuilds of the compilation
database. The `str` of a node is its filename, which is stable across
runs.
env['CPPDEFINES'] may return a deque object in scons 4.5.0+ (see
SCons/scons#4321).
Explicitly convert it to a list where needed.
Tested with scons 4.4.0, 4.5.0, 4.5.1 and 4.5.2.
According to `timeit`, this is slightly faster. Also, `.copy()` will
work when `V` is a `collections.deque`, but `[:]` fails in that case.
SCons issue https://github.com/SCons/scons/issues/3876 (first released
in SCons 4.5.0) changed the storage of the `CPPDEFINES` variable from a
`list` to a `deque`, which broke use of `env.get(name, [])[:]`, since
`deque` cannot copy itself using `[:]`. Switch to using `.copy()` to
obtain a shallow copy.
```
>>> # timing comparison
>>> timeit.timeit(stmt='a.copy()', setup='a = [1, 2, 3, 4]')
0.05652548000216484
>>> timeit.timeit(stmt='a[:]', setup='a = [1, 2, 3, 4]')
0.06801111809909344
```
```
>>> # deque cannot copy using slice notation
>>> a = [1, 2, 3]
>>> from collections import deque
>>> b = deque([1, 2, 3])
>>> a.copy()
[1, 2, 3]
>>> a[:]
[1, 2, 3]
>>> b.copy()
deque([1, 2, 3])
>>> b[:]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: sequence index must be integer, not 'slice'
```
Reported-by: Kreeblah <https://github.com/dxx-rebirth/dxx-rebirth/issues/704>
Switch from showing the Python tuple, which is unambiguous but hard to
run at a prompt, to showing the output of `shlex.join`, which is
normally correct for use at a shell prompt, and should still be
reasonably unambiguous.
Support for explicitly deleted functions has been mandatory for a long
time. Historically, this was handled through a special SConf test to
work around a clang-3.4 bug that warned when a deleted function had
named parameters. Support for clang-3.4 was dropped some time ago, and
newer versions do not require this workaround. Simplify the SConf
script by declaring explicitly deleted functions a required feature, so
that they can be tested as a group with the other required features.
Only trust the output of pkg-config if it exited success. Capture any
text sent to its stderr and reprint it, with decorations, to the screen
and to the log.
Since this should never be invoked, simplify the definition. The new
version is slightly less informative in case a logic error causes it to
be called, but is far shorter and easier to understand.
Commit d2478d0708 made support for C++17 fallthrough mandatory, and
should have deleted this test. Delete it now.
Fixes: d2478d0708 ("Require support for C++17 attribute [[fallthrough]]")
Apple clang is currently version 14, but Apple's libc++ is version 13,
and so lacks even more std::ranges support than previously reported.
Add more stub backports to work around this.
OS X still uses clang-14, which lacks sufficient std::ranges support for
recent Rebirth changes.
- Rewrite uses of std::ranges::SYMBOL to ranges::SYMBOL
- Add a stub header that, on gcc, provides for each SYMBOL a statement
`using std::ranges::SYMBOL;`, to delegate back to the standard library
implementation.
- On clang, define a minimal implementation of the required symbols,
without constraint enforcement. Compile-testing with gcc will catch
constraint violations.
Once OS X clang ships a standard library with the required features,
this stub header will be removed and the uses changed back to their full
names.
Adding `final` can allow gcc to devirtualize a call. Request compiler
warnings wherever `final` would improve this. As of this writing, there
are no places where `final` would be helpful and would also be wrong, so
this is enabled everywhere.
VR requires glDrawBuffer, which Mesa OpenGL ES does not offer. Default
VR to disabled for OpenGL ES users. Users who want to try it anyway can
still set use_stereo_render=1 in the SCons environment.
std::ranges::find_if permits use of a sentinel instead of a full
iterator, and supports std::ranges::find as an alternative to certain
simple uses of std::find_if.
Where possible, use the form that takes a range, rather than the form
that takes two iterators.
Add a declared, but not defined, default constructor for
self_return_iterator to satisfy the standard library's concept
`semiregular`, which insists that sentinels be default-constructible,
even for those functions that never need to do so.
Add a defined, but unused, operator++(postfix) for zip_iterator to
satisfy a standard library concept for `forward_iterator`.
Haiku does not accept `-pthread`, and puts its network functions in a
separate library. Add a special HaikuPlatformSettings to handle these
quirks.
Reported-by: LambdaCalculus37 <https://github.com/dxx-rebirth/dxx-rebirth/issues/641>
Windows shells interpret quoting differently from Linux shells, causing
some of the generated strings to have ugly escape sequences in them.
Switch to passing the defined values as lists of character codes, so
that no quoting is needed. This makes the command line uglier, but
produces more readable strings in the generated program.
These are not referenced in SConstruct. messagebox.c uses C linkage for
symbols that would be referenced from a C++ file, so this has likely
been broken since the common code moved to C++.
These have been disabled since they were added in 2016, and the new HTTP
tracker they were meant to support was never put into service. Remove
the tests.
Fixes: 9a8bd1aecb ("Add disabled tests for curl/jsoncpp")
Compiler error messages are generally better when reporting a misuse
that fails a requires() versus reporting a misuse that fails a
std::enable_if. In some cases, this also makes the code clearer, and
avoids the need for dummy template parameters as a place to invoke
std::enable_if.
clang-13 needed an operator==(const exact_type<T>&) defined to avoid an
ambiguity. Now that C++20 mode is enabled, switch to a
compiler-generated operator== instead of manually defining the
equivalent function.
clang rejects the entire database if any entry lacks a 'file' key,
regardless of whether the entry is used.
Fixes: bc6d043f5d ("Extend SConstruct compilation_database support to cover Program()")
`check_header_includes` requires `git` to be installed and able to list
files from a working copy. When `GIT=''` is used, SConstruct is told
not to find or run `git`. This caused a traceback when
`check_header_includes` tried to use git to list headers. Reorder the
test to report a clear failure message.
Commit f1606f7747 ("Simplify test for
__builtin_bswap16") changed the SConstruct test to either define both
DXX_HAVE_BUILTIN_BSWAP and DXX_HAVE_BUILTIN_BSWAP16 or to define neither
of them. Follow up that commit by removing the definition of
DXX_HAVE_BUILTIN_BSWAP16 and redirecting uses of it to
DXX_HAVE_BUILTIN_BSWAP.
The result of git-archive expanding `$Format:%H` will always be a valid
string. Repeat the format specifier, so that the call to `.format()`
can be removed.