[Bf-blender-cvs] [aadd3550289] master: Fix possible C-linkage warning on Clang

Julian Eisel noreply at git.blender.org
Mon Jun 14 19:02:34 CEST 2021


Commit: aadd3550289aa0258e9e99864bc6063d0dd03460
Author: Julian Eisel
Date:   Thu Apr 15 23:45:13 2021 +0200
Branches: master
https://developer.blender.org/rBaadd3550289aa0258e9e99864bc6063d0dd03460

Fix possible C-linkage warning on Clang

The warning would appear when using the `ENUM_OPERATORS()` macro inside
of an `extern "C"` block.
Didn't cause a warning in master currently, but in the
`asset-browser-poselib` branch.

After macro expansion, there would be C++ code in code with C linkage
(`extern "C"`). So make sure the expanded C++ code always uses C++
linkage.
The syntax used is totally C++ compliant: the C++ standard requires that
in such nested linkage specifications, the innermost one determines the
linking language (e.g. see
https://timsong-cpp.github.io/cppwp/n4659/dcl.link#4).

===================================================================

M	source/blender/blenlib/BLI_utildefines.h

===================================================================

diff --git a/source/blender/blenlib/BLI_utildefines.h b/source/blender/blenlib/BLI_utildefines.h
index 1c6e6ffe578..0bf117df43b 100644
--- a/source/blender/blenlib/BLI_utildefines.h
+++ b/source/blender/blenlib/BLI_utildefines.h
@@ -785,6 +785,7 @@ extern bool BLI_memory_is_zero(const void *arr, const size_t arr_size);
  * To use after the enum declaration. */
 /* If any enumerator `C` is set to say `A|B`, then `C` would be the max enum value. */
 #  define ENUM_OPERATORS(_enum_type, _max_enum_value) \
+    extern "C++" { \
     inline constexpr _enum_type operator|(_enum_type a, _enum_type b) \
     { \
       return static_cast<_enum_type>(static_cast<int>(a) | b); \
@@ -804,7 +805,8 @@ extern bool BLI_memory_is_zero(const void *arr, const size_t arr_size);
     inline _enum_type &operator&=(_enum_type &a, _enum_type b) \
     { \
       return a = static_cast<_enum_type>(static_cast<int>(a) & b); \
-    }
+    } \
+    } /* extern "C++" */
 
 #else
 /* Output nothing. */



More information about the Bf-blender-cvs mailing list