From 54d6a22d19df0a9b192e1479bc93ea0f7a3a7591 Mon Sep 17 00:00:00 2001 From: Sylvie <35663410+Rangi42@users.noreply.github.com> Date: Fri, 23 Feb 2024 16:46:53 -0500 Subject: [PATCH] Build with pedantically standard C++ (#1309) * Remove array designators (not standard C++) * Build with pedantically standard C++ --- CMakeLists.txt | 9 +++++---- Makefile | 4 ++-- include/asm/lexer.hpp | 3 ++- include/platform.hpp | 7 ------- src/asm/lexer.cpp | 12 ++++++------ src/asm/warning.cpp | 44 +++++++++++++++++++++---------------------- src/link/main.cpp | 6 +++--- src/link/output.cpp | 18 +++++++++--------- src/link/patch.cpp | 6 +++--- src/linkdefs.cpp | 22 +++++++++++----------- 10 files changed, 63 insertions(+), 68 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 712ce049..8fadfc8b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) diff --git a/Makefile b/Makefile index 642f6f46..7ada1ee6 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/include/asm/lexer.hpp b/include/asm/lexer.hpp index a1337515..52dbecb2 100644 --- a/include/asm/lexer.hpp +++ b/include/asm/lexer.hpp @@ -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); diff --git a/include/platform.hpp b/include/platform.hpp index 0bd25b0e..e4b875b7 100644 --- a/include/platform.hpp +++ b/include/platform.hpp @@ -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 diff --git a/src/asm/lexer.cpp b/src/asm/lexer.cpp index 53d88b8e..7d71405d 100644 --- a/src/asm/lexer.cpp +++ b/src/asm/lexer.cpp @@ -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](); diff --git a/src/asm/warning.cpp b/src/asm/warning.cpp index 377da547..60415eb8 100644 --- a/src/asm/warning.cpp +++ b/src/asm/warning.cpp @@ -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)]; diff --git a/src/link/main.cpp b/src/link/main.cpp index 5a31c43b..96467e84 100644 --- a/src/link/main.cpp +++ b/src/link/main.cpp @@ -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) diff --git a/src/link/output.cpp b/src/link/output.cpp index 8e59ae7f..0a59350e 100644 --- a/src/link/output.cpp +++ b/src/link/output.cpp @@ -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; diff --git a/src/link/patch.cpp b/src/link/patch.cpp index a2dfe450..8b9318b6 100644 --- a/src/link/patch.cpp +++ b/src/link/patch.cpp @@ -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 diff --git a/src/linkdefs.cpp b/src/linkdefs.cpp index 24bb99e5..cfd16af8 100644 --- a/src/linkdefs.cpp +++ b/src/linkdefs.cpp @@ -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 };