Move core type info to a Flag.

Currently we check the type info name for a prefix of `core::` to
determine if a type is core or not. Instead, add a new `kCore` Flag
which is set in all the types in core/type.

Change-Id: If24024088f84ac40b016a79fdaa1a835fa04ce9a
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/324435
Reviewed-by: Ryan Harrison <rharrison@chromium.org>
Reviewed-by: Steven Perron <stevenperron@google.com>
Commit-Queue: Kai Ninomiya <kainino@chromium.org>
diff --git a/src/tint/lang/core/ir/structural_validator.cc b/src/tint/lang/core/ir/structural_validator.cc
index af2d49e..99a0809 100644
--- a/src/tint/lang/core/ir/structural_validator.cc
+++ b/src/tint/lang/core/ir/structural_validator.cc
@@ -93,11 +93,6 @@
     return false;
 }
 
-/// @returns true if @p type is in the core namespace
-bool IsCoreType(const core::type::Type* type) {
-    return std::string_view(type->TypeInfo().name).starts_with("tint::core");
-}
-
 template <typename CTX, typename IMPL>
 void WalkTypeAndMembers(CTX& ctx,
                         const core::type::Type* type,
@@ -646,7 +641,7 @@
         return;
     }
 
-    if (!ir_.properties.Contains(Property::kAllowNonCoreTypes) && !IsCoreType(root)) {
+    if (!ir_.properties.Contains(Property::kAllowNonCoreTypes) && !root->IsCore()) {
         diag() << "non-core types not allowed in core IR";
         return;
     }
diff --git a/src/tint/lang/core/type/abstract_numeric.cc b/src/tint/lang/core/type/abstract_numeric.cc
index 819b86c..dc1b19c 100644
--- a/src/tint/lang/core/type/abstract_numeric.cc
+++ b/src/tint/lang/core/type/abstract_numeric.cc
@@ -34,6 +34,7 @@
 AbstractNumeric::AbstractNumeric(size_t hash)
     : Base(hash,
            core::type::Flags{
+               Flag::kCore,
                Flag::kConstructable,
                Flag::kCreationFixedFootprint,
                Flag::kFixedFootprint,
diff --git a/src/tint/lang/core/type/array.cc b/src/tint/lang/core/type/array.cc
index 8c74c52..63df602 100644
--- a/src/tint/lang/core/type/array.cc
+++ b/src/tint/lang/core/type/array.cc
@@ -43,7 +43,8 @@
 namespace {
 
 core::type::Flags FlagsFrom(const Type* element, const ArrayCount* count) {
-    core::type::Flags flags;
+    core::type::Flags flags{Flag::kCore};
+
     // Only constant-expression sized arrays are constructible
     if (count->Is<ConstantArrayCount>()) {
         if (element->IsConstructible()) {
diff --git a/src/tint/lang/core/type/atomic.cc b/src/tint/lang/core/type/atomic.cc
index d72476d..af5339c 100644
--- a/src/tint/lang/core/type/atomic.cc
+++ b/src/tint/lang/core/type/atomic.cc
@@ -41,6 +41,7 @@
 Atomic::Atomic(const core::type::Type* subtype)
     : Base(Hash(tint::TypeCode::Of<Atomic>().bits, subtype),
            core::type::Flags{
+               Flag::kCore,
                Flag::kCreationFixedFootprint,
                Flag::kFixedFootprint,
                Flag::kHostShareable,
diff --git a/src/tint/lang/core/type/binding_array.cc b/src/tint/lang/core/type/binding_array.cc
index b991f1d..eea51cd 100644
--- a/src/tint/lang/core/type/binding_array.cc
+++ b/src/tint/lang/core/type/binding_array.cc
@@ -40,7 +40,7 @@
 namespace tint::core::type {
 
 BindingArray::BindingArray(const Type* element, const ArrayCount* count)
-    : Base(Hash(tint::TypeCode::Of<BindingArray>().bits, count), core::type::Flags{}),
+    : Base(Hash(tint::TypeCode::Of<BindingArray>().bits, count), core::type::Flags{Flag::kCore}),
       element_(element),
       count_(count) {
     TINT_ASSERT(element_);
diff --git a/src/tint/lang/core/type/bool.cc b/src/tint/lang/core/type/bool.cc
index 1a86fed..c8ee8b5 100644
--- a/src/tint/lang/core/type/bool.cc
+++ b/src/tint/lang/core/type/bool.cc
@@ -36,6 +36,7 @@
 Bool::Bool()
     : Base(static_cast<size_t>(tint::TypeCode::Of<Bool>().bits),
            core::type::Flags{
+               Flag::kCore,
                Flag::kConstructable,
                Flag::kCreationFixedFootprint,
                Flag::kFixedFootprint,
diff --git a/src/tint/lang/core/type/buffer.cc b/src/tint/lang/core/type/buffer.cc
index 009f376..9d93173 100644
--- a/src/tint/lang/core/type/buffer.cc
+++ b/src/tint/lang/core/type/buffer.cc
@@ -33,8 +33,8 @@
 
 namespace tint::core::type {
 
-const core::type::Flags sizedFlags{Flag::kHostShareable, Flag::kFixedFootprint};
-const core::type::Flags unsizedFlags{Flag::kHostShareable};
+const core::type::Flags sizedFlags{Flag::kCore, Flag::kHostShareable, Flag::kFixedFootprint};
+const core::type::Flags unsizedFlags{Flag::kCore, Flag::kHostShareable};
 
 Buffer::Buffer(const ArrayCount* size)
     : Base(Hash(tint::TypeCode::Of<Buffer>().bits, size),
diff --git a/src/tint/lang/core/type/f16.cc b/src/tint/lang/core/type/f16.cc
index 0ee753d..cdff483 100644
--- a/src/tint/lang/core/type/f16.cc
+++ b/src/tint/lang/core/type/f16.cc
@@ -36,6 +36,7 @@
 F16::F16()
     : Base(static_cast<size_t>(tint::TypeCode::Of<F16>().bits),
            core::type::Flags{
+               Flag::kCore,
                Flag::kConstructable,
                Flag::kCreationFixedFootprint,
                Flag::kFixedFootprint,
diff --git a/src/tint/lang/core/type/f32.cc b/src/tint/lang/core/type/f32.cc
index a4cba58..f4374b1 100644
--- a/src/tint/lang/core/type/f32.cc
+++ b/src/tint/lang/core/type/f32.cc
@@ -36,6 +36,7 @@
 F32::F32()
     : Base(static_cast<size_t>(tint::TypeCode::Of<F32>().bits),
            core::type::Flags{
+               Flag::kCore,
                Flag::kConstructable,
                Flag::kCreationFixedFootprint,
                Flag::kFixedFootprint,
diff --git a/src/tint/lang/core/type/function.cc b/src/tint/lang/core/type/function.cc
index 6b703fe..9bd4a33 100644
--- a/src/tint/lang/core/type/function.cc
+++ b/src/tint/lang/core/type/function.cc
@@ -34,7 +34,8 @@
 namespace tint::core::type {
 
 Function::Function()
-    : Base(static_cast<size_t>(tint::TypeCode::Of<Function>().bits), core::type::Flags{}) {}
+    : Base(static_cast<size_t>(tint::TypeCode::Of<Function>().bits),
+           core::type::Flags{Flag::kCore}) {}
 
 Function::~Function() = default;
 
diff --git a/src/tint/lang/core/type/i32.cc b/src/tint/lang/core/type/i32.cc
index 4942b48..8a04a1b 100644
--- a/src/tint/lang/core/type/i32.cc
+++ b/src/tint/lang/core/type/i32.cc
@@ -36,6 +36,7 @@
 I32::I32()
     : Base(static_cast<size_t>(tint::TypeCode::Of<I32>().bits),
            core::type::Flags{
+               Flag::kCore,
                Flag::kConstructable,
                Flag::kCreationFixedFootprint,
                Flag::kFixedFootprint,
diff --git a/src/tint/lang/core/type/i8.cc b/src/tint/lang/core/type/i8.cc
index 8ad133e..959d130 100644
--- a/src/tint/lang/core/type/i8.cc
+++ b/src/tint/lang/core/type/i8.cc
@@ -36,6 +36,7 @@
 I8::I8()
     : Base(static_cast<size_t>(tint::TypeCode::Of<I8>().bits),
            core::type::Flags{
+               Flag::kCore,
                Flag::kConstructable,
                Flag::kCreationFixedFootprint,
                Flag::kFixedFootprint,
diff --git a/src/tint/lang/core/type/invalid.cc b/src/tint/lang/core/type/invalid.cc
index cc929a8..b45a45a 100644
--- a/src/tint/lang/core/type/invalid.cc
+++ b/src/tint/lang/core/type/invalid.cc
@@ -34,7 +34,8 @@
 namespace tint::core::type {
 
 Invalid::Invalid()
-    : Base(static_cast<size_t>(tint::TypeCode::Of<Invalid>().bits), core::type::Flags{}) {}
+    : Base(static_cast<size_t>(tint::TypeCode::Of<Invalid>().bits),
+           core::type::Flags{Flag::kCore}) {}
 
 Invalid::~Invalid() = default;
 
diff --git a/src/tint/lang/core/type/matrix.cc b/src/tint/lang/core/type/matrix.cc
index b53395f..379bca8 100644
--- a/src/tint/lang/core/type/matrix.cc
+++ b/src/tint/lang/core/type/matrix.cc
@@ -41,6 +41,7 @@
 Matrix::Matrix(const Vector* column_type, uint32_t columns)
     : Base(Hash(tint::TypeCode::Of<Vector>().bits, columns, column_type),
            core::type::Flags{
+               Flag::kCore,
                Flag::kConstructable,
                Flag::kCreationFixedFootprint,
                Flag::kFixedFootprint,
diff --git a/src/tint/lang/core/type/memory_view.cc b/src/tint/lang/core/type/memory_view.cc
index 6ea0d41..74e8493 100644
--- a/src/tint/lang/core/type/memory_view.cc
+++ b/src/tint/lang/core/type/memory_view.cc
@@ -38,7 +38,7 @@
                        core::AddressSpace address_space,
                        const Type* store_type,
                        core::Access access)
-    : Base(hash, core::type::Flags{}),
+    : Base(hash, core::type::Flags{Flag::kCore}),
       store_type_(store_type),
       address_space_(address_space),
       access_(access) {
diff --git a/src/tint/lang/core/type/resource_table.cc b/src/tint/lang/core/type/resource_table.cc
index 6fe76bf..4e9e7e9 100644
--- a/src/tint/lang/core/type/resource_table.cc
+++ b/src/tint/lang/core/type/resource_table.cc
@@ -37,7 +37,7 @@
 
 ResourceTable::ResourceTable(const core::type::Type* binding_type)
     : Base(static_cast<size_t>(Hash(tint::TypeCode::Of<ResourceTable>().bits, binding_type)),
-           core::type::Flags{}),
+           core::type::Flags{Flag::kCore}),
       binding_type_(binding_type) {}
 
 bool ResourceTable::Equals(const UniqueNode& other) const {
diff --git a/src/tint/lang/core/type/sampler.cc b/src/tint/lang/core/type/sampler.cc
index e70c368..b09dcd7 100644
--- a/src/tint/lang/core/type/sampler.cc
+++ b/src/tint/lang/core/type/sampler.cc
@@ -35,7 +35,8 @@
 namespace tint::core::type {
 
 Sampler::Sampler(SamplerKind kind)
-    : Base(Hash(tint::TypeCode::Of<Sampler>().bits, kind), core::type::Flags{}), kind_(kind) {}
+    : Base(Hash(tint::TypeCode::Of<Sampler>().bits, kind), core::type::Flags{Flag::kCore}),
+      kind_(kind) {}
 
 Sampler::~Sampler() = default;
 
diff --git a/src/tint/lang/core/type/string.cc b/src/tint/lang/core/type/string.cc
index 25c372d..35c3ee2 100644
--- a/src/tint/lang/core/type/string.cc
+++ b/src/tint/lang/core/type/string.cc
@@ -39,7 +39,7 @@
 
 namespace tint::core::type {
 
-String::String() : Base(Hash(tint::TypeCode::Of<String>().bits), core::type::Flags{}) {}
+String::String() : Base(Hash(tint::TypeCode::Of<String>().bits), core::type::Flags{Flag::kCore}) {}
 
 bool String::Equals(const UniqueNode& other) const {
     return other.Is<String>();
diff --git a/src/tint/lang/core/type/struct.cc b/src/tint/lang/core/type/struct.cc
index 6db3275..562b5b9 100644
--- a/src/tint/lang/core/type/struct.cc
+++ b/src/tint/lang/core/type/struct.cc
@@ -53,10 +53,8 @@
 
 Flags FlagsFrom(VectorRef<const StructMember*> members) {
     Flags flags{
-        Flag::kConstructable,
-        Flag::kCreationFixedFootprint,
-        Flag::kFixedFootprint,
-        Flag::kHostShareable,
+        Flag::kCore,           Flag::kConstructable, Flag::kCreationFixedFootprint,
+        Flag::kFixedFootprint, Flag::kHostShareable,
     };
     for (auto* member : members) {
         if (!member->Type()->IsConstructible()) {
diff --git a/src/tint/lang/core/type/subgroup_matrix.cc b/src/tint/lang/core/type/subgroup_matrix.cc
index cc12722..a394d87 100644
--- a/src/tint/lang/core/type/subgroup_matrix.cc
+++ b/src/tint/lang/core/type/subgroup_matrix.cc
@@ -39,6 +39,7 @@
                                uint32_t rows)
     : Base(Hash(tint::TypeCode::Of<SubgroupMatrix>().bits, kind, columns, rows, subtype),
            core::type::Flags{
+               Flag::kCore,
                Flag::kConstructable,
                Flag::kCreationFixedFootprint,
                Flag::kFixedFootprint,
diff --git a/src/tint/lang/core/type/texture.cc b/src/tint/lang/core/type/texture.cc
index acd271c..0538891 100644
--- a/src/tint/lang/core/type/texture.cc
+++ b/src/tint/lang/core/type/texture.cc
@@ -31,7 +31,8 @@
 
 namespace tint::core::type {
 
-Texture::Texture(size_t hash, TextureDimension dim) : Base(hash, core::type::Flags{}), dim_(dim) {}
+Texture::Texture(size_t hash, TextureDimension dim)
+    : Base(hash, core::type::Flags{Flag::kCore}), dim_(dim) {}
 
 Texture::~Texture() = default;
 
diff --git a/src/tint/lang/core/type/type.h b/src/tint/lang/core/type/type.h
index fa367fe..e7779ab 100644
--- a/src/tint/lang/core/type/type.h
+++ b/src/tint/lang/core/type/type.h
@@ -45,6 +45,9 @@
 
 /// Flag is an enumerator of type flag bits, used by Flags.
 enum Flag {
+    /// Type is core to Tint. (Note, this doesn't mean it's core in WGSL, it may be from an
+    /// extension but it is _not_ a dialect type.)
+    kCore,
     /// Type is constructable.
     /// @see https://gpuweb.github.io/gpuweb/wgsl/#constructible-types
     kConstructable,
@@ -114,6 +117,9 @@
     /// @returns the flags on the type
     core::type::Flags Flags() { return flags_; }
 
+    /// @returns true if the type is part of the core types
+    inline bool IsCore() const { return flags_.Contains(Flag::kCore); }
+
     /// @returns true if type is constructable
     /// https://gpuweb.github.io/gpuweb/wgsl/#constructible-types
     inline bool IsConstructible() const { return flags_.Contains(Flag::kConstructable); }
diff --git a/src/tint/lang/core/type/u16.cc b/src/tint/lang/core/type/u16.cc
index 04e6659..7bed56a 100644
--- a/src/tint/lang/core/type/u16.cc
+++ b/src/tint/lang/core/type/u16.cc
@@ -36,6 +36,7 @@
 U16::U16()
     : Base(static_cast<size_t>(tint::TypeCode::Of<U16>().bits),
            core::type::Flags{
+               Flag::kCore,
                Flag::kConstructable,
                Flag::kCreationFixedFootprint,
                Flag::kFixedFootprint,
diff --git a/src/tint/lang/core/type/u32.cc b/src/tint/lang/core/type/u32.cc
index c1b2910..2f121e9 100644
--- a/src/tint/lang/core/type/u32.cc
+++ b/src/tint/lang/core/type/u32.cc
@@ -36,6 +36,7 @@
 U32::U32()
     : Base(static_cast<size_t>(tint::TypeCode::Of<U32>().bits),
            core::type::Flags{
+               Flag::kCore,
                Flag::kConstructable,
                Flag::kCreationFixedFootprint,
                Flag::kFixedFootprint,
diff --git a/src/tint/lang/core/type/u64.cc b/src/tint/lang/core/type/u64.cc
index cffb248..a437735 100644
--- a/src/tint/lang/core/type/u64.cc
+++ b/src/tint/lang/core/type/u64.cc
@@ -36,6 +36,7 @@
 U64::U64()
     : Base(static_cast<size_t>(tint::TypeCode::Of<U64>().bits),
            core::type::Flags{
+               Flag::kCore,
                Flag::kConstructable,
                Flag::kCreationFixedFootprint,
                Flag::kFixedFootprint,
diff --git a/src/tint/lang/core/type/u8.cc b/src/tint/lang/core/type/u8.cc
index 68bf7f5..a51b338 100644
--- a/src/tint/lang/core/type/u8.cc
+++ b/src/tint/lang/core/type/u8.cc
@@ -36,6 +36,7 @@
 U8::U8()
     : Base(static_cast<size_t>(tint::TypeCode::Of<U8>().bits),
            core::type::Flags{
+               Flag::kCore,
                Flag::kConstructable,
                Flag::kCreationFixedFootprint,
                Flag::kFixedFootprint,
diff --git a/src/tint/lang/core/type/vector.cc b/src/tint/lang/core/type/vector.cc
index 5662735..865681d 100644
--- a/src/tint/lang/core/type/vector.cc
+++ b/src/tint/lang/core/type/vector.cc
@@ -41,6 +41,7 @@
 
 core::type::Flags FlagsFrom(const Type* element) {
     core::type::Flags flags{
+        Flag::kCore,
         Flag::kConstructable,
         Flag::kCreationFixedFootprint,
         Flag::kFixedFootprint,
diff --git a/src/tint/lang/core/type/void.cc b/src/tint/lang/core/type/void.cc
index 7e1fbf2..4e6a977 100644
--- a/src/tint/lang/core/type/void.cc
+++ b/src/tint/lang/core/type/void.cc
@@ -33,7 +33,8 @@
 
 namespace tint::core::type {
 
-Void::Void() : Base(static_cast<size_t>(tint::TypeCode::Of<Void>().bits), core::type::Flags{}) {}
+Void::Void()
+    : Base(static_cast<size_t>(tint::TypeCode::Of<Void>().bits), core::type::Flags{Flag::kCore}) {}
 
 Void::~Void() = default;