diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h
index e40cd85..ba68a01 100644
--- a/src/corelib/kernel/qmetatype.h
+++ b/src/corelib/kernel/qmetatype.h
@@ -18,6 +18,7 @@
 #endif
 #include <QtCore/qscopeguard.h>
 
+#include <type_traits>
 #include <array>
 #include <new>
 #include <vector>
@@ -826,7 +829,13 @@
     struct IsGadgetHelper { enum { IsRealGadget = false, IsGadgetOrDerivedFrom = false }; };
 
     template<typename T>
+#if defined(__clang__) && (__clang_major__ > 11)
+    // Clang does not reject T::QtGadgetHelper as ambiguous if a class inherits from two QGADGETS
+    // but is not a QGADGET itself
+    struct IsGadgetHelper<T, std::void_t<typename T::QtGadgetHelper, decltype(&T::qt_check_for_QGADGET_macro)>>
+#else
     struct IsGadgetHelper<T, typename T::QtGadgetHelper>
+#endif
     {
         template <typename X>
         static char checkType(void (X::*)());
@@ -841,7 +850,11 @@
     struct IsPointerToGadgetHelper { enum { IsRealGadget = false, IsGadgetOrDerivedFrom = false }; };
 
     template<typename T>
+#if defined(__clang__) && (__clang_major__ > 11)
+    struct IsPointerToGadgetHelper<T*, std::void_t<typename T::QtGadgetHelper, decltype(&T::qt_check_for_QGADGET_macro)>>
+#else
     struct IsPointerToGadgetHelper<T*, typename T::QtGadgetHelper>
+#endif
     {
         using BaseType = T;
         template <typename X>