Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"type": "prerelease",
"comment": "Fix NativeModule templates to work with clang",
"packageName": "react-native-windows",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}
17 changes: 10 additions & 7 deletions vnext/Microsoft.ReactNative.Cxx/ModuleRegistration.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,23 @@
// The macros below are internal implementation details for macro defined in nativeModules.h
//

// ADL-based fallback: returns false for any type not tagged by the macros below.
// Using ADL instead of explicit template specialization allows the macros to be
// used inside a namespace (explicit specializations of a global template must
// occur at global scope, which the macros cannot guarantee).
template <typename T>
struct IsReactTurboModule;
constexpr bool ReactIsReactTurboModuleImpl(T *) noexcept {
return false;
}

// Default to false if no specific override
template <typename T>
struct IsReactTurboModule : std::false_type {};
struct IsReactTurboModule : std::bool_constant<ReactIsReactTurboModuleImpl(static_cast<T *>(nullptr))> {};

#define INTERNAL_REACT_MODULE_REGISTRATION_AND_PROVIDER( \
moduleStruct, moduleName, eventEmitterName, isReactTurboModule) \
struct moduleStruct; \
\
template <> \
struct IsReactTurboModule<moduleStruct> : std::isReactTurboModule##_type {}; \
constexpr bool ReactIsReactTurboModuleImpl(moduleStruct *) noexcept { return isReactTurboModule; } \
\
template <class TDummy> \
struct moduleStruct##_ModuleRegistration final : winrt::Microsoft::ReactNative::ModuleRegistration { \
Expand Down Expand Up @@ -70,8 +74,7 @@ struct IsReactTurboModule : std::false_type {};
moduleStruct, moduleName, eventEmitterName, isReactTurboModule) \
struct moduleStruct; \
\
template <> \
struct IsReactTurboModule<moduleStruct> : std::isReactTurboModule##_type {}; \
constexpr bool ReactIsReactTurboModuleImpl(moduleStruct *) noexcept { return isReactTurboModule; } \
\
template <class TRegistry> \
constexpr void GetReactModuleInfo(moduleStruct *, TRegistry &registry) noexcept { \
Expand Down
2 changes: 1 addition & 1 deletion vnext/Microsoft.ReactNative.Cxx/NativeModules.h
Original file line number Diff line number Diff line change
Expand Up @@ -918,7 +918,7 @@ struct ModuleEventFieldInfo<TFunc<void(TArgs...)> TModule::*> {
return [module = static_cast<ModuleType *>(module), field](IReactContext const &) noexcept {
// Default emitter will do nothing
// This will be replaced with a method that will call the jsi EventEmitter when JS requests the emitter
module->*field = [](TArgs... args) noexcept {};
module->*field = [](TArgs... /*args*/) noexcept {};
};
} else {
return [module = static_cast<ModuleType *>(module), field, eventName, eventEmitterName](
Expand Down
Loading