From 2ff5979799750c4618fbbce489cce0d27574de08 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Thu, 25 May 2023 13:33:38 +0000 Subject: [PATCH] feat: workaround for `DOMAIN` macro This is a macro on some (older) versions of GCC, and macOS, and Windows. Sigh. I moved the `#undef` block to a common section. I also took the opportunity to add a regression test for all these macros that need to be `#undef`'d. --- src/file_lists.cmake | 1 + src/google/protobuf/BUILD.bazel | 2 + src/google/protobuf/port_def.inc | 19 ++-- src/google/protobuf/port_undef.inc | 7 +- .../protobuf/unittest_proto3_bad_macros.proto | 98 +++++++++++++++++++ 5 files changed, 113 insertions(+), 14 deletions(-) create mode 100644 src/google/protobuf/unittest_proto3_bad_macros.proto diff --git a/src/file_lists.cmake b/src/file_lists.cmake index d94620950375..d07c12ab1a50 100644 --- a/src/file_lists.cmake +++ b/src/file_lists.cmake @@ -671,6 +671,7 @@ set(protobuf_test_protos_files ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_proto3.proto ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_proto3_arena.proto ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_proto3_arena_lite.proto + ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_proto3_bad_macros.proto ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_proto3_lite.proto ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_proto3_optional.proto ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_retention.proto diff --git a/src/google/protobuf/BUILD.bazel b/src/google/protobuf/BUILD.bazel index 06b4a98b4bc7..f99b93149f38 100644 --- a/src/google/protobuf/BUILD.bazel +++ b/src/google/protobuf/BUILD.bazel @@ -659,6 +659,7 @@ filegroup( "unittest_proto3.proto", "unittest_proto3_arena.proto", "unittest_proto3_arena_lite.proto", + "unittest_proto3_bad_macros.proto", "unittest_proto3_lite.proto", "unittest_proto3_optional.proto", "unittest_retention.proto", @@ -716,6 +717,7 @@ proto_library( "unittest_proto3.proto", "unittest_proto3_arena.proto", "unittest_proto3_arena_lite.proto", + "unittest_proto3_bad_macros.proto", "unittest_proto3_lite.proto", "unittest_proto3_optional.proto", "unittest_retention.proto", diff --git a/src/google/protobuf/port_def.inc b/src/google/protobuf/port_def.inc index a05464329524..fd387bad9820 100644 --- a/src/google/protobuf/port_def.inc +++ b/src/google/protobuf/port_def.inc @@ -887,13 +887,6 @@ static_assert(PROTOBUF_ABSL_MIN(20230125, 3), #undef PACKAGE #endif -// autoheader defines this in some circumstances -#ifdef PACKAGE -#define PROTOBUF_DID_UNDEF_PACKAGE -#pragma push_macro("PACKAGE") -#undef PACKAGE -#endif - // a few common headers define this #ifdef PACKED #define PROTOBUF_DID_UNDEF_PACKED @@ -901,6 +894,13 @@ static_assert(PROTOBUF_ABSL_MIN(20230125, 3), #undef PACKED #endif +// This is a macro on Windows, macOS, and some variants of GCC. +#ifdef DOMAIN +#define PROTOBUF_DID_UNDEF_DOMAIN +#pragma push_macro("DOMAIN") +#undef DOMAIN +#endif + // linux is a legacy MACRO defined in most popular C++ standards. #ifdef linux #pragma push_macro("linux") @@ -915,8 +915,6 @@ static_assert(PROTOBUF_ABSL_MIN(20230125, 3), #undef CREATE_NEW #pragma push_macro("DELETE") #undef DELETE -#pragma push_macro("DOMAIN") -#undef DOMAIN #pragma push_macro("DOUBLE_CLICK") #undef DOUBLE_CLICK #pragma push_macro("ERROR") @@ -974,9 +972,6 @@ static_assert(PROTOBUF_ABSL_MIN(20230125, 3), #endif // _WIN32 #ifdef __APPLE__ -// Inconvenient macro names from usr/include/math.h in some macOS SDKs. -#pragma push_macro("DOMAIN") -#undef DOMAIN // Inconvenient macro names from /usr/include/mach/boolean.h in some macOS SDKs. #pragma push_macro("TRUE") #undef TRUE diff --git a/src/google/protobuf/port_undef.inc b/src/google/protobuf/port_undef.inc index b377715c82d8..7ac2b03ea434 100644 --- a/src/google/protobuf/port_undef.inc +++ b/src/google/protobuf/port_undef.inc @@ -131,6 +131,11 @@ #undef PROTOBUF_DID_UNDEF_PACKED #endif +#ifdef PROTOBUF_DID_UNDEF_DOMAIN +#pragma pop_macro("DOMAIN") +#undef PROTOBUF_DID_UNDEF_DOMAIN +#endif + #ifdef PROTOBUF_DID_UNDEF_LINUX #pragma pop_macro("linux") #endif @@ -138,7 +143,6 @@ #ifdef _WIN32 #pragma pop_macro("CREATE_NEW") #pragma pop_macro("DELETE") -#pragma pop_macro("DOMAIN") #pragma pop_macro("DOUBLE_CLICK") #pragma pop_macro("ERROR") #pragma pop_macro("ERROR_BUSY") @@ -169,7 +173,6 @@ #endif #ifdef __APPLE__ -#pragma pop_macro("DOMAIN") #pragma pop_macro("TRUE") #pragma pop_macro("FALSE") #pragma pop_macro("UID_MAX") diff --git a/src/google/protobuf/unittest_proto3_bad_macros.proto b/src/google/protobuf/unittest_proto3_bad_macros.proto new file mode 100644 index 000000000000..2370352a15dd --- /dev/null +++ b/src/google/protobuf/unittest_proto3_bad_macros.proto @@ -0,0 +1,98 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2013 Google LLC All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package protobuf_unittest; + +option csharp_namespace = "ProtobufUnittest"; +option java_multiple_files = true; +option java_package = "com.google.protobuf.testing.proto"; + +// `google/protobuf/port_def.inc` #undef's a number of inconvenient macros +// defined in system headers under varying circumstances. The code generated +// from this file will not compile if those `#undef` calls are accidentally +// removed. + +// This generates `GID_MAX`, which is a macro in some circumstances. +enum GID { + GID_UNUSED = 0; +} + +// This generates `UID_MAX`, which is a mcro in some circumstances. +enum UID { + UID_UNUSED = 0; +} + +// Just a container for bad macro names. Some of these do not follow the normal +// naming conventions, this is intentional, we just want to trigger a build +// failure if the macro is left defined. +enum BadNames { + // autoheader defines this in some circumstances. + PACKAGE = 0; + // The comment says "a few common headers define this". + PACKED = 1; + // Defined in many Linux system headers. + linux = 2; + // This is often a macro in ``. + DOMAIN = 3; + // These are defined in both Windows and macOS headers. + TRUE = 4; + FALSE = 5; + // Sometimes defined in Windows system headers. + CREATE_NEW = 6; + DELETE = 7; + DOUBLE_CLICK = 8; + ERROR = 9; + ERROR_BUSY = 10; + ERROR_INSTALL_FAILED = 11; + ERROR_NOT_FOUND = 12; + GetClassName = 13; + GetCurrentTime = 14; + GetMessage = 15; + GetObject = 16; + IGNORE = 17; + IN = 18; + INPUT_KEYBOARD = 19; + NO_ERROR = 20; + OUT = 21; + OPTIONAL = 22; + NEAR = 23; + NO_DATA = 24; + REASON_UNKNOWN = 25; + SERVICE_DISABLED = 26; + SEVERITY_ERROR = 27; + STATUS_PENDING = 28; + STRICT = 29; + // Sometimed defined in macOS system headers. + TYPE_BOOL = 30; + // Defined in macOS, Windows, and Linux headers. + DEBUG = 31; +}