diff --git a/Code/Framework/AzCore/AzCore/RTTI/ReflectContext.h b/Code/Framework/AzCore/AzCore/RTTI/ReflectContext.h index e03823888a..5b27cb9f88 100644 --- a/Code/Framework/AzCore/AzCore/RTTI/ReflectContext.h +++ b/Code/Framework/AzCore/AzCore/RTTI/ReflectContext.h @@ -274,7 +274,7 @@ namespace AZ { using Callable = AZStd::conditional_t::value, AZStd::function::function_type>, Invocable>; public: - AZ_RTTI((AttributeInvocable, "{60D5804F-9AF4-4EB1-8F5A-62AFB4883F9D}"), AZ::Attribute); + AZ_RTTI((AttributeInvocable, "{60D5804F-9AF4-4EB1-8F5A-62AFB4883F9D}", Invocable), AZ::Attribute); AZ_CLASS_ALLOCATOR(AttributeInvocable, SystemAllocator, 0); template explicit AttributeInvocable(CallableType&& invocable) diff --git a/Code/Framework/AzCore/Tests/Serialization.cpp b/Code/Framework/AzCore/Tests/Serialization.cpp index 036942f9dd..4dba972324 100644 --- a/Code/Framework/AzCore/Tests/Serialization.cpp +++ b/Code/Framework/AzCore/Tests/Serialization.cpp @@ -2010,6 +2010,28 @@ TEST_F(SerializeBasicTest, BasicTypeTest_Succeed) } + + /* + This test will dynamic cast (azrtti_cast) between incompatible types, which should always result in nullptr. + If this test fails, the RTTI declaration for the relevant type is incorrect. + */ + TEST_F(Serialization, AttributeRTTI) + { + { + AttributeInvocable> fn([](AZStd::string x) { return x + x; }); + Attribute* fnDownCast = &fn; + auto fnUpCast = azrtti_cast>*>(fnDownCast); + EXPECT_EQ(fnUpCast, nullptr); + } + + { + AttributeFunction fn([](AZStd::string x) { return x + x; }); + Attribute* fnDownCast = &fn; + auto fnUpCast = azrtti_cast*>(fnDownCast); + EXPECT_EQ(fnUpCast, nullptr); + } + } + /* * Deprecation */