Build with pedantically standard C++ (#1309)

* Remove array designators (not standard C++)

* Build with pedantically standard C++
This commit is contained in:
Sylvie
2024-02-23 16:46:53 -05:00
committed by GitHub
parent c0d534f5ad
commit 54d6a22d19
10 changed files with 63 additions and 68 deletions

View File

@@ -33,10 +33,11 @@ if(MSVC)
add_link_options(${SAN_FLAGS})
endif()
else()
# TODO: use -pedantic after non-C++ idioms are gone
add_compile_options(-Wall)
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
add_compile_options(-Wno-c99-designator)
add_compile_options(-Wall -pedantic)
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
# C++20 allows macros to take zero variadic arguments, but Clang (aka AppleClang on macOS)
# does not recognize this yet.
add_compile_options(-Wno-gnu-zero-variadic-macro-arguments)
endif()
add_definitions(-D_POSIX_C_SOURCE=200809L)
if(SANITIZERS)

View File

@@ -25,8 +25,8 @@ PNGLDLIBS := `${PKG_CONFIG} --libs-only-l libpng`
# Note: if this comes up empty, `version.cpp` will automatically fall back to last release number
VERSION_STRING := `git --git-dir=.git describe --tags --dirty --always 2>/dev/null`
# TODO: use -pedantic after non-C++ idioms are gone
WARNFLAGS := -Wall -Wno-unknown-warning-option -Wno-c99-designator
WARNFLAGS := -Wall -pedantic -Wno-unknown-warning-option \
-Wno-gnu-zero-variadic-macro-arguments
# Overridable CXXFLAGS
CXXFLAGS ?= -O3 -flto -DNDEBUG

View File

@@ -55,7 +55,8 @@ enum LexerMode {
LEXER_RAW,
LEXER_SKIP_TO_ELIF,
LEXER_SKIP_TO_ENDC,
LEXER_SKIP_TO_ENDR
LEXER_SKIP_TO_ENDR,
NB_LEXER_MODES
};
void lexer_SetMode(enum LexerMode mode);

View File

@@ -55,13 +55,6 @@
#define NONNULL(ptr) *ptr // ptr[static 1]
#define restrict
// C++ doesn't support designated array initializers, but they're a gcc extension
#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
# define AT(index) [index] =
#else
# define AT(index)
#endif
// MSVC uses a different name for O_RDWR, and needs an additional _O_BINARY flag
#ifdef _MSC_VER
# include <fcntl.h>

View File

@@ -2433,12 +2433,12 @@ int yylex(void)
if (lexerState->atLineStart && !lexerState->expansions)
nextLine();
static int (* const lexerModeFuncs[])(void) = {
AT(LEXER_NORMAL) yylex_NORMAL,
AT(LEXER_RAW) yylex_RAW,
AT(LEXER_SKIP_TO_ELIF) yylex_SKIP_TO_ELIF,
AT(LEXER_SKIP_TO_ENDC) yylex_SKIP_TO_ENDC,
AT(LEXER_SKIP_TO_ENDR) yylex_SKIP_TO_ENDR,
static int (* const lexerModeFuncs[NB_LEXER_MODES])(void) = {
yylex_NORMAL,
yylex_RAW,
yylex_SKIP_TO_ELIF,
yylex_SKIP_TO_ENDC,
yylex_SKIP_TO_ENDR,
};
int token = lexerModeFuncs[lexerState->mode]();

View File

@@ -19,29 +19,29 @@ unsigned int nbErrors = 0;
unsigned int maxErrors = 0;
static const enum WarningState defaultWarnings[ARRAY_SIZE(warningStates)] = {
AT(WARNING_ASSERT) WARNING_ENABLED,
AT(WARNING_BACKWARDS_FOR) WARNING_DISABLED,
AT(WARNING_BUILTIN_ARG) WARNING_DISABLED,
AT(WARNING_CHARMAP_REDEF) WARNING_DISABLED,
AT(WARNING_DIV) WARNING_DISABLED,
AT(WARNING_EMPTY_DATA_DIRECTIVE) WARNING_DISABLED,
AT(WARNING_EMPTY_MACRO_ARG) WARNING_DISABLED,
AT(WARNING_EMPTY_STRRPL) WARNING_DISABLED,
AT(WARNING_LARGE_CONSTANT) WARNING_DISABLED,
AT(WARNING_LONG_STR) WARNING_DISABLED,
AT(WARNING_MACRO_SHIFT) WARNING_DISABLED,
AT(WARNING_NESTED_COMMENT) WARNING_ENABLED,
AT(WARNING_OBSOLETE) WARNING_ENABLED,
AT(WARNING_SHIFT) WARNING_DISABLED,
AT(WARNING_SHIFT_AMOUNT) WARNING_DISABLED,
AT(WARNING_USER) WARNING_ENABLED,
WARNING_ENABLED, // WARNING_ASSERT
WARNING_DISABLED, // WARNING_BACKWARDS_FOR
WARNING_DISABLED, // WARNING_BUILTIN_ARG
WARNING_DISABLED, // WARNING_CHARMAP_REDEF
WARNING_DISABLED, // WARNING_DIV
WARNING_DISABLED, // WARNING_EMPTY_DATA_DIRECTIVE
WARNING_DISABLED, // WARNING_EMPTY_MACRO_ARG
WARNING_DISABLED, // WARNING_EMPTY_STRRPL
WARNING_DISABLED, // WARNING_LARGE_CONSTANT
WARNING_DISABLED, // WARNING_LONG_STR
WARNING_DISABLED, // WARNING_MACRO_SHIFT
WARNING_ENABLED, // WARNING_NESTED_COMMENT
WARNING_ENABLED, // WARNING_OBSOLETE
WARNING_DISABLED, // WARNING_SHIFT
WARNING_DISABLED, // WARNING_SHIFT_AMOUNT
WARNING_ENABLED, // WARNING_USER
AT(WARNING_NUMERIC_STRING_1) WARNING_ENABLED,
AT(WARNING_NUMERIC_STRING_2) WARNING_DISABLED,
AT(WARNING_TRUNCATION_1) WARNING_ENABLED,
AT(WARNING_TRUNCATION_2) WARNING_DISABLED,
AT(WARNING_UNMAPPED_CHAR_1) WARNING_ENABLED,
AT(WARNING_UNMAPPED_CHAR_2) WARNING_DISABLED,
WARNING_ENABLED, // WARNING_NUMERIC_STRING_1
WARNING_DISABLED, // WARNING_NUMERIC_STRING_2
WARNING_ENABLED, // WARNING_TRUNCATION_1
WARNING_DISABLED, // WARNING_TRUNCATION_2
WARNING_ENABLED, // WARNING_UNMAPPED_CHAR_1
WARNING_DISABLED, // WARNING_UNMAPPED_CHAR_2
};
enum WarningState warningStates[ARRAY_SIZE(warningStates)];

View File

@@ -205,9 +205,9 @@ struct {
char const *name;
uint16_t max;
} scrambleSpecs[SCRAMBLE_UNK] = {
AT(SCRAMBLE_ROMX) { "romx", 65535 },
AT(SCRAMBLE_SRAM) { "sram", 255 },
AT(SCRAMBLE_WRAMX) { "wramx", 7 },
{ "romx", 65535 }, // SCRAMBLE_ROMX
{ "sram", 255 }, // SCRAMBLE_SRAM
{ "wramx", 7 }, // SCRAMBLE_WRAMX
};
static void parseScrambleSpec(char const *spec)

View File

@@ -61,15 +61,15 @@ static enum SectionType typeMap[SECTTYPE_INVALID] = {
void out_AddSection(struct Section const *section)
{
static const uint32_t maxNbBanks[] = {
AT(SECTTYPE_WRAM0) 1,
AT(SECTTYPE_VRAM) 2,
AT(SECTTYPE_ROMX) UINT32_MAX,
AT(SECTTYPE_ROM0) 1,
AT(SECTTYPE_HRAM) 1,
AT(SECTTYPE_WRAMX) 7,
AT(SECTTYPE_SRAM) UINT32_MAX,
AT(SECTTYPE_OAM) 1,
static const uint32_t maxNbBanks[SECTTYPE_INVALID] = {
1, // SECTTYPE_WRAM0
2, // SECTTYPE_VRAM
UINT32_MAX, // SECTTYPE_ROMX
1, // SECTTYPE_ROM0
1, // SECTTYPE_HRAM
7, // SECTTYPE_WRAMX
UINT32_MAX, // SECTTYPE_SRAM
1, // SECTTYPE_OAM
};
uint32_t targetBank = section->bank - sectionTypeInfo[section->type].firstBank;

View File

@@ -534,9 +534,9 @@ static void applyFilePatches(struct Section *section, struct Section *dataSectio
int32_t min;
int32_t max;
} const types[PATCHTYPE_INVALID] = {
AT(PATCHTYPE_BYTE) { 1, -128, 255 },
AT(PATCHTYPE_WORD) { 2, -32768, 65536 },
AT(PATCHTYPE_LONG) { 4, INT32_MIN, INT32_MAX },
{ 1, -128, 255 }, // PATCHTYPE_BYTE
{ 2, -32768, 65536 }, // PATCHTYPE_WORD
{ 4, INT32_MIN, INT32_MAX }, // PATCHTYPE_LONG
};
if (!isError && (value < types[patch->type].min

View File

@@ -8,56 +8,56 @@ using namespace std::literals;
// The default values are the most lax, as they are used as-is by RGBASM; only RGBLINK has the full info,
// so RGBASM's job is only to catch unconditional errors earlier.
struct SectionTypeInfo sectionTypeInfo[SECTTYPE_INVALID] = {
AT(SECTTYPE_WRAM0) {
{ // SECTTYPE_WRAM0
.name = "WRAM0"s,
.startAddr = 0xC000,
.size = 0x2000, // Patched to 0x1000 if !isWRA0Mode
.firstBank = 0,
.lastBank = 0,
},
AT(SECTTYPE_VRAM) {
{ // SECTTYPE_VRAM
.name = "VRAM"s,
.startAddr = 0x8000,
.size = 0x2000,
.firstBank = 0,
.lastBank = 1, // Patched to 0 if isDmgMode
},
AT(SECTTYPE_ROMX) {
{ // SECTTYPE_ROMX
.name = "ROMX"s,
.startAddr = 0x4000,
.size = 0x4000,
.firstBank = 1,
.lastBank = 65535,
},
AT(SECTTYPE_ROM0) {
{ // SECTTYPE_ROM0
.name = "ROM0"s,
.startAddr = 0x0000,
.size = 0x8000, // Patched to 0x4000 if !is32kMode
.firstBank = 0,
.lastBank = 0,
},
AT(SECTTYPE_HRAM) {
{ // SECTTYPE_HRAM
.name = "HRAM"s,
.startAddr = 0xFF80,
.size = 0x007F,
.firstBank = 0,
.lastBank = 0,
},
AT(SECTTYPE_WRAMX) {
{ // SECTTYPE_WRAMX
.name = "WRAMX"s,
.startAddr = 0xD000,
.size = 0x1000,
.firstBank = 1,
.lastBank = 7,
},
AT(SECTTYPE_SRAM) {
{ // SECTTYPE_SRAM
.name = "SRAM"s,
.startAddr = 0xA000,
.size = 0x2000,
.firstBank = 0,
.lastBank = 255,
},
AT(SECTTYPE_OAM) {
{ // SECTTYPE_OAM
.name = "OAM"s,
.startAddr = 0xFE00,
.size = 0x00A0,
@@ -67,7 +67,7 @@ struct SectionTypeInfo sectionTypeInfo[SECTTYPE_INVALID] = {
};
char const * const sectionModNames[] = {
AT(SECTION_NORMAL) "regular",
AT(SECTION_UNION) "union",
AT(SECTION_FRAGMENT) "fragment",
"regular", // SECTION_NORMAL
"union", // SECTION_UNION
"fragment", // SECTION_FRAGMENT
};