diff --git a/React/Base/RCTConvert.h b/React/Base/RCTConvert.h index dbd4d1f7b8b..a799d72863e 100644 --- a/React/Base/RCTConvert.h +++ b/React/Base/RCTConvert.h @@ -207,6 +207,17 @@ RCT_CUSTOM_CONVERTER(type, name, [json getter]) #define RCT_NUMBER_CONVERTER(type, getter) \ RCT_CUSTOM_CONVERTER(type, type, [RCT_DEBUG ? [self NSNumber:json] : json getter]) +/** + * When using RCT_ENUM_CONVERTER in ObjC, the compiler is OK with us returning + * the underlying NSInteger/NSUInteger. In ObjC++, this is a type mismatch and + * we need to explicitly cast the return value to expected enum return type. + */ +#ifdef __cplusplus +#define _RCT_CAST(type, expr) static_cast(expr) +#else +#define _RCT_CAST(type, expr) expr +#endif + /** * This macro is used for creating converters for enum types. */ @@ -218,7 +229,7 @@ RCT_CUSTOM_CONVERTER(type, type, [RCT_DEBUG ? [self NSNumber:json] : json getter dispatch_once(&onceToken, ^{ \ mapping = values; \ }); \ - return [RCTConvertEnumValue(#type, mapping, @(default), json) getter]; \ + return _RCT_CAST(type, [RCTConvertEnumValue(#type, mapping, @(default), json) getter]); \ } /** @@ -233,7 +244,7 @@ RCT_CUSTOM_CONVERTER(type, type, [RCT_DEBUG ? [self NSNumber:json] : json getter dispatch_once(&onceToken, ^{ \ mapping = values; \ }); \ - return [RCTConvertMultiEnumValue(#type, mapping, @(default), json) getter]; \ + return _RCT_CAST(type, [RCTConvertMultiEnumValue(#type, mapping, @(default), json) getter]); \ } /**