@@ -1753,17 +1753,19 @@ bitflags! {
1753
1753
pub struct AdtFlags : u32 {
1754
1754
const NO_ADT_FLAGS = 0 ;
1755
1755
const IS_ENUM = 1 << 0 ;
1756
- const IS_PHANTOM_DATA = 1 << 1 ;
1757
- const IS_FUNDAMENTAL = 1 << 2 ;
1758
- const IS_UNION = 1 << 3 ;
1759
- const IS_BOX = 1 << 4 ;
1756
+ const IS_UNION = 1 << 1 ;
1757
+ const IS_STRUCT = 1 << 2 ;
1758
+ const IS_TUPLE_STRUCT = 1 << 3 ;
1759
+ const IS_PHANTOM_DATA = 1 << 4 ;
1760
+ const IS_FUNDAMENTAL = 1 << 5 ;
1761
+ const IS_BOX = 1 << 6 ;
1760
1762
/// Indicates whether the type is an `Arc`.
1761
- const IS_ARC = 1 << 5 ;
1763
+ const IS_ARC = 1 << 7 ;
1762
1764
/// Indicates whether the type is an `Rc`.
1763
- const IS_RC = 1 << 6 ;
1765
+ const IS_RC = 1 << 8 ;
1764
1766
/// Indicates whether the variant list of this ADT is `#[non_exhaustive]`.
1765
1767
/// (i.e., this flag is never set unless this ADT is an enum).
1766
- const IS_VARIANT_LIST_NON_EXHAUSTIVE = 1 << 7 ;
1768
+ const IS_VARIANT_LIST_NON_EXHAUSTIVE = 1 << 9 ;
1767
1769
}
1768
1770
}
1769
1771
@@ -2077,31 +2079,43 @@ impl<'a, 'gcx, 'tcx> AdtDef {
2077
2079
repr : ReprOptions ) -> Self {
2078
2080
debug ! ( "AdtDef::new({:?}, {:?}, {:?}, {:?})" , did, kind, variants, repr) ;
2079
2081
let mut flags = AdtFlags :: NO_ADT_FLAGS ;
2082
+
2083
+ if kind == AdtKind :: Enum && tcx. has_attr ( did, "non_exhaustive" ) {
2084
+ debug ! ( "found non-exhaustive variant list for {:?}" , did) ;
2085
+ flags = flags | AdtFlags :: IS_VARIANT_LIST_NON_EXHAUSTIVE ;
2086
+ }
2087
+ flags |= match kind {
2088
+ AdtKind :: Enum => AdtFlags :: IS_ENUM ,
2089
+ AdtKind :: Union => AdtFlags :: IS_UNION ,
2090
+ AdtKind :: Struct => AdtFlags :: IS_STRUCT ,
2091
+ } ;
2092
+
2093
+ if let AdtKind :: Struct = kind {
2094
+ let variant_def = & variants[ VariantIdx :: new ( 0 ) ] ;
2095
+ let def_key = tcx. def_key ( variant_def. did ) ;
2096
+ match def_key. disambiguated_data . data {
2097
+ DefPathData :: StructCtor => flags |= AdtFlags :: IS_TUPLE_STRUCT ,
2098
+ _ => ( ) ,
2099
+ }
2100
+ }
2101
+
2080
2102
let attrs = tcx. get_attrs ( did) ;
2081
2103
if attr:: contains_name ( & attrs, "fundamental" ) {
2082
- flags = flags | AdtFlags :: IS_FUNDAMENTAL ;
2104
+ flags |= AdtFlags :: IS_FUNDAMENTAL ;
2083
2105
}
2084
2106
if Some ( did) == tcx. lang_items ( ) . phantom_data ( ) {
2085
- flags = flags | AdtFlags :: IS_PHANTOM_DATA ;
2107
+ flags |= AdtFlags :: IS_PHANTOM_DATA ;
2086
2108
}
2087
2109
if Some ( did) == tcx. lang_items ( ) . owned_box ( ) {
2088
- flags = flags | AdtFlags :: IS_BOX ;
2110
+ flags |= AdtFlags :: IS_BOX ;
2089
2111
}
2090
2112
if Some ( did) == tcx. lang_items ( ) . arc ( ) {
2091
- flags = flags | AdtFlags :: IS_ARC ;
2113
+ flags |= AdtFlags :: IS_ARC ;
2092
2114
}
2093
2115
if Some ( did) == tcx. lang_items ( ) . rc ( ) {
2094
- flags = flags | AdtFlags :: IS_RC ;
2095
- }
2096
- if kind == AdtKind :: Enum && tcx. has_attr ( did, "non_exhaustive" ) {
2097
- debug ! ( "found non-exhaustive variant list for {:?}" , did) ;
2098
- flags = flags | AdtFlags :: IS_VARIANT_LIST_NON_EXHAUSTIVE ;
2099
- }
2100
- match kind {
2101
- AdtKind :: Enum => flags = flags | AdtFlags :: IS_ENUM ,
2102
- AdtKind :: Union => flags = flags | AdtFlags :: IS_UNION ,
2103
- AdtKind :: Struct => { }
2116
+ flags |= AdtFlags :: IS_RC ;
2104
2117
}
2118
+
2105
2119
AdtDef {
2106
2120
did,
2107
2121
variants,
@@ -2112,25 +2126,31 @@ impl<'a, 'gcx, 'tcx> AdtDef {
2112
2126
2113
2127
#[ inline]
2114
2128
pub fn is_struct ( & self ) -> bool {
2115
- !self . is_union ( ) && !self . is_enum ( )
2129
+ self . flags . contains ( AdtFlags :: IS_STRUCT )
2130
+ }
2131
+
2132
+ /// If this function returns `true`, it implies that `is_struct` must return `true`.
2133
+ #[ inline]
2134
+ pub fn is_tuple_struct ( & self ) -> bool {
2135
+ self . flags . contains ( AdtFlags :: IS_TUPLE_STRUCT )
2116
2136
}
2117
2137
2118
2138
#[ inline]
2119
2139
pub fn is_union ( & self ) -> bool {
2120
- self . flags . intersects ( AdtFlags :: IS_UNION )
2140
+ self . flags . contains ( AdtFlags :: IS_UNION )
2121
2141
}
2122
2142
2123
2143
#[ inline]
2124
2144
pub fn is_enum ( & self ) -> bool {
2125
- self . flags . intersects ( AdtFlags :: IS_ENUM )
2145
+ self . flags . contains ( AdtFlags :: IS_ENUM )
2126
2146
}
2127
2147
2128
2148
#[ inline]
2129
2149
pub fn is_variant_list_non_exhaustive ( & self ) -> bool {
2130
- self . flags . intersects ( AdtFlags :: IS_VARIANT_LIST_NON_EXHAUSTIVE )
2150
+ self . flags . contains ( AdtFlags :: IS_VARIANT_LIST_NON_EXHAUSTIVE )
2131
2151
}
2132
2152
2133
- /// Returns the kind of the ADT - Struct or Enum .
2153
+ /// Returns the kind of the ADT.
2134
2154
#[ inline]
2135
2155
pub fn adt_kind ( & self ) -> AdtKind {
2136
2156
if self . is_enum ( ) {
@@ -2159,33 +2179,33 @@ impl<'a, 'gcx, 'tcx> AdtDef {
2159
2179
}
2160
2180
}
2161
2181
2162
- /// Returns whether this type is #[fundamental] for the purposes
2182
+ /// Returns whether this type is ` #[fundamental]` for the purposes
2163
2183
/// of coherence checking.
2164
2184
#[ inline]
2165
2185
pub fn is_fundamental ( & self ) -> bool {
2166
- self . flags . intersects ( AdtFlags :: IS_FUNDAMENTAL )
2186
+ self . flags . contains ( AdtFlags :: IS_FUNDAMENTAL )
2167
2187
}
2168
2188
2169
2189
/// Returns `true` if this is PhantomData<T>.
2170
2190
#[ inline]
2171
2191
pub fn is_phantom_data ( & self ) -> bool {
2172
- self . flags . intersects ( AdtFlags :: IS_PHANTOM_DATA )
2192
+ self . flags . contains ( AdtFlags :: IS_PHANTOM_DATA )
2173
2193
}
2174
2194
2175
2195
/// Returns `true` if this is `Arc<T>`.
2176
2196
pub fn is_arc ( & self ) -> bool {
2177
- self . flags . intersects ( AdtFlags :: IS_ARC )
2197
+ self . flags . contains ( AdtFlags :: IS_ARC )
2178
2198
}
2179
2199
2180
2200
/// Returns `true` if this is `Rc<T>`.
2181
2201
pub fn is_rc ( & self ) -> bool {
2182
- self . flags . intersects ( AdtFlags :: IS_RC )
2202
+ self . flags . contains ( AdtFlags :: IS_RC )
2183
2203
}
2184
2204
2185
2205
/// Returns `true` if this is Box<T>.
2186
2206
#[ inline]
2187
2207
pub fn is_box ( & self ) -> bool {
2188
- self . flags . intersects ( AdtFlags :: IS_BOX )
2208
+ self . flags . contains ( AdtFlags :: IS_BOX )
2189
2209
}
2190
2210
2191
2211
/// Returns whether this type has a destructor.
0 commit comments