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}) add_link_options(${SAN_FLAGS})
endif() endif()
else() else()
# TODO: use -pedantic after non-C++ idioms are gone add_compile_options(-Wall -pedantic)
add_compile_options(-Wall) if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") # C++20 allows macros to take zero variadic arguments, but Clang (aka AppleClang on macOS)
add_compile_options(-Wno-c99-designator) # does not recognize this yet.
add_compile_options(-Wno-gnu-zero-variadic-macro-arguments)
endif() endif()
add_definitions(-D_POSIX_C_SOURCE=200809L) add_definitions(-D_POSIX_C_SOURCE=200809L)
if(SANITIZERS) 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 # 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` VERSION_STRING := `git --git-dir=.git describe --tags --dirty --always 2>/dev/null`
# TODO: use -pedantic after non-C++ idioms are gone WARNFLAGS := -Wall -pedantic -Wno-unknown-warning-option \
WARNFLAGS := -Wall -Wno-unknown-warning-option -Wno-c99-designator -Wno-gnu-zero-variadic-macro-arguments
# Overridable CXXFLAGS # Overridable CXXFLAGS
CXXFLAGS ?= -O3 -flto -DNDEBUG CXXFLAGS ?= -O3 -flto -DNDEBUG

View File

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

View File

@@ -55,13 +55,6 @@
#define NONNULL(ptr) *ptr // ptr[static 1] #define NONNULL(ptr) *ptr // ptr[static 1]
#define restrict #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 // MSVC uses a different name for O_RDWR, and needs an additional _O_BINARY flag
#ifdef _MSC_VER #ifdef _MSC_VER
# include <fcntl.h> # include <fcntl.h>

View File

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

View File

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

View File

@@ -205,9 +205,9 @@ struct {
char const *name; char const *name;
uint16_t max; uint16_t max;
} scrambleSpecs[SCRAMBLE_UNK] = { } scrambleSpecs[SCRAMBLE_UNK] = {
AT(SCRAMBLE_ROMX) { "romx", 65535 }, { "romx", 65535 }, // SCRAMBLE_ROMX
AT(SCRAMBLE_SRAM) { "sram", 255 }, { "sram", 255 }, // SCRAMBLE_SRAM
AT(SCRAMBLE_WRAMX) { "wramx", 7 }, { "wramx", 7 }, // SCRAMBLE_WRAMX
}; };
static void parseScrambleSpec(char const *spec) 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) void out_AddSection(struct Section const *section)
{ {
static const uint32_t maxNbBanks[] = { static const uint32_t maxNbBanks[SECTTYPE_INVALID] = {
AT(SECTTYPE_WRAM0) 1, 1, // SECTTYPE_WRAM0
AT(SECTTYPE_VRAM) 2, 2, // SECTTYPE_VRAM
AT(SECTTYPE_ROMX) UINT32_MAX, UINT32_MAX, // SECTTYPE_ROMX
AT(SECTTYPE_ROM0) 1, 1, // SECTTYPE_ROM0
AT(SECTTYPE_HRAM) 1, 1, // SECTTYPE_HRAM
AT(SECTTYPE_WRAMX) 7, 7, // SECTTYPE_WRAMX
AT(SECTTYPE_SRAM) UINT32_MAX, UINT32_MAX, // SECTTYPE_SRAM
AT(SECTTYPE_OAM) 1, 1, // SECTTYPE_OAM
}; };
uint32_t targetBank = section->bank - sectionTypeInfo[section->type].firstBank; 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 min;
int32_t max; int32_t max;
} const types[PATCHTYPE_INVALID] = { } const types[PATCHTYPE_INVALID] = {
AT(PATCHTYPE_BYTE) { 1, -128, 255 }, { 1, -128, 255 }, // PATCHTYPE_BYTE
AT(PATCHTYPE_WORD) { 2, -32768, 65536 }, { 2, -32768, 65536 }, // PATCHTYPE_WORD
AT(PATCHTYPE_LONG) { 4, INT32_MIN, INT32_MAX }, { 4, INT32_MIN, INT32_MAX }, // PATCHTYPE_LONG
}; };
if (!isError && (value < types[patch->type].min 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, // 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. // so RGBASM's job is only to catch unconditional errors earlier.
struct SectionTypeInfo sectionTypeInfo[SECTTYPE_INVALID] = { struct SectionTypeInfo sectionTypeInfo[SECTTYPE_INVALID] = {
AT(SECTTYPE_WRAM0) { { // SECTTYPE_WRAM0
.name = "WRAM0"s, .name = "WRAM0"s,
.startAddr = 0xC000, .startAddr = 0xC000,
.size = 0x2000, // Patched to 0x1000 if !isWRA0Mode .size = 0x2000, // Patched to 0x1000 if !isWRA0Mode
.firstBank = 0, .firstBank = 0,
.lastBank = 0, .lastBank = 0,
}, },
AT(SECTTYPE_VRAM) { { // SECTTYPE_VRAM
.name = "VRAM"s, .name = "VRAM"s,
.startAddr = 0x8000, .startAddr = 0x8000,
.size = 0x2000, .size = 0x2000,
.firstBank = 0, .firstBank = 0,
.lastBank = 1, // Patched to 0 if isDmgMode .lastBank = 1, // Patched to 0 if isDmgMode
}, },
AT(SECTTYPE_ROMX) { { // SECTTYPE_ROMX
.name = "ROMX"s, .name = "ROMX"s,
.startAddr = 0x4000, .startAddr = 0x4000,
.size = 0x4000, .size = 0x4000,
.firstBank = 1, .firstBank = 1,
.lastBank = 65535, .lastBank = 65535,
}, },
AT(SECTTYPE_ROM0) { { // SECTTYPE_ROM0
.name = "ROM0"s, .name = "ROM0"s,
.startAddr = 0x0000, .startAddr = 0x0000,
.size = 0x8000, // Patched to 0x4000 if !is32kMode .size = 0x8000, // Patched to 0x4000 if !is32kMode
.firstBank = 0, .firstBank = 0,
.lastBank = 0, .lastBank = 0,
}, },
AT(SECTTYPE_HRAM) { { // SECTTYPE_HRAM
.name = "HRAM"s, .name = "HRAM"s,
.startAddr = 0xFF80, .startAddr = 0xFF80,
.size = 0x007F, .size = 0x007F,
.firstBank = 0, .firstBank = 0,
.lastBank = 0, .lastBank = 0,
}, },
AT(SECTTYPE_WRAMX) { { // SECTTYPE_WRAMX
.name = "WRAMX"s, .name = "WRAMX"s,
.startAddr = 0xD000, .startAddr = 0xD000,
.size = 0x1000, .size = 0x1000,
.firstBank = 1, .firstBank = 1,
.lastBank = 7, .lastBank = 7,
}, },
AT(SECTTYPE_SRAM) { { // SECTTYPE_SRAM
.name = "SRAM"s, .name = "SRAM"s,
.startAddr = 0xA000, .startAddr = 0xA000,
.size = 0x2000, .size = 0x2000,
.firstBank = 0, .firstBank = 0,
.lastBank = 255, .lastBank = 255,
}, },
AT(SECTTYPE_OAM) { { // SECTTYPE_OAM
.name = "OAM"s, .name = "OAM"s,
.startAddr = 0xFE00, .startAddr = 0xFE00,
.size = 0x00A0, .size = 0x00A0,
@@ -67,7 +67,7 @@ struct SectionTypeInfo sectionTypeInfo[SECTTYPE_INVALID] = {
}; };
char const * const sectionModNames[] = { char const * const sectionModNames[] = {
AT(SECTION_NORMAL) "regular", "regular", // SECTION_NORMAL
AT(SECTION_UNION) "union", "union", // SECTION_UNION
AT(SECTION_FRAGMENT) "fragment", "fragment", // SECTION_FRAGMENT
}; };