Avatar
omochimetaru 9/15/2022 6:09 AM
そうだと思う PRもgeneric enum support ってタイトルになってるし (edited)
6:10 AM
c++ // CHECK-NEXT: template<class T_0_0> // CHECK-NEXT: requires swift::isUsableInGenericContext<T_0_0> // CHECK-NEXT: inline T_0_0 GenericOpt<T_0_0>::getSome() const { // CHECK-NEXT: if (!isSome()) abort(); // CHECK-NEXT: alignas(GenericOpt) unsigned char buffer[sizeof(GenericOpt)]; // CHECK-NEXT: auto *thisCopy = new(buffer) GenericOpt(*this); // CHECK-NEXT: char * _Nonnull payloadFromDestruction = thisCopy->_destructiveProjectEnumData(); // CHECK-NEXT: if constexpr (std::is_base_of<::swift::_impl::RefCountedClass, T_0_0>::value) { // CHECK-NEXT: void *returnValue; // CHECK-NEXT: returnValue = *reinterpret_cast<void **>(payloadFromDestruction); // CHECK-NEXT: return ::swift::_impl::implClassFor<T_0_0>::type::makeRetained(returnValue); // CHECK-NEXT: } else if constexpr (::swift::_impl::isValueType<T_0_0>) { // CHECK-NEXT: return ::swift::_impl::implClassFor<T_0_0>::type::returnNewValue([&](void * _Nonnull returnValue) { // CHECK-NEXT: return ::swift::_impl::implClassFor<T_0_0>::type::initializeWithTake(reinterpret_cast<char * _Nonnull>(returnValue), payloadFromDestruction); // CHECK-NEXT: }); // CHECK-NEXT: } else if constexpr (::swift::_impl::isSwiftBridgedCxxRecord<T_0_0>) { // CHECK-NEXT: abort(); // CHECK-NEXT: } else { // CHECK-NEXT: T_0_0 returnValue; // CHECK-NEXT: memcpy(&returnValue, payloadFromDestruction, sizeof(returnValue)); // CHECK-NEXT: return returnValue; // CHECK-NEXT: } // CHECK-NEXT: }
6:10 AM
↑生成されたコードも constexpr 使って最適化で畳めそうな感じになってる