forked from libre-chip/fayalite
		
	add more thorough checks that bounds are properly handled on #[hdl] structs
This commit is contained in:
		
							parent
							
								
									d0694cbd52
								
							
						
					
					
						commit
						4909724995
					
				
					 1 changed files with 88 additions and 7 deletions
				
			
		|  | @ -1,6 +1,13 @@ | |||
| // SPDX-License-Identifier: LGPL-3.0-or-later
 | ||||
| // See Notices.txt for copyright information
 | ||||
| use fayalite::prelude::*; | ||||
| #[cfg(todo)] | ||||
| use fayalite::{ | ||||
|     bundle::BundleType, | ||||
|     enum_::EnumType, | ||||
|     int::{BoolOrIntType, IntType}, | ||||
|     ty::StaticType, | ||||
| }; | ||||
| use std::marker::PhantomData; | ||||
| 
 | ||||
| #[hdl(outline_generated)] | ||||
|  | @ -32,13 +39,6 @@ pub struct S2<T = ()> { | |||
|     pub v: E<T>, | ||||
| } | ||||
| 
 | ||||
| #[cfg(todo)] | ||||
| #[hdl(outline_generated)] | ||||
| pub struct S4<W: KnownSize, W2: KnownSize> { | ||||
|     pub v: UIntType<W>, | ||||
|     pub v2: SIntType<W2>, | ||||
| } | ||||
| 
 | ||||
| // check that #[hdl] properly handles hygiene
 | ||||
| macro_rules! types_in_macros { | ||||
|     ($a:ident, $b:ident, $c:ident, $d:ident, $e:ident, $f:ident, $A:ident, $B:ident, $C:ident, $D:ident, $E:ident, $F:ident) => { | ||||
|  | @ -104,3 +104,84 @@ macro_rules! types_in_macros { | |||
| } | ||||
| 
 | ||||
| types_in_macros!(); | ||||
| 
 | ||||
| mod bound_kind { | ||||
|     use fayalite::prelude::*; | ||||
| 
 | ||||
|     #[hdl] | ||||
|     pub struct Type<T> { | ||||
|         v: T, | ||||
|     } | ||||
| 
 | ||||
|     #[hdl] | ||||
|     pub struct Size<T: ::fayalite::int::Size> { | ||||
|         v: UIntType<T>, | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| macro_rules! check_bounds { | ||||
|     ($name:ident<$(#[$field:ident, $kind:ident] $var:ident: $($bound:ident +)*),*>) => { | ||||
|         #[cfg(todo)] | ||||
|         #[hdl(outline_generated)] | ||||
|         struct $name<$($var: $($bound +)*,)*> { | ||||
|             $($field: bound_kind::$kind<$var>,)* | ||||
|         } | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| check_bounds!(CheckBoundsS0<#[a, Size] A: Size +>); | ||||
| check_bounds!(CheckBoundsS1<#[a, Size] A: KnownSize +>); | ||||
| check_bounds!(CheckBoundsT0<#[a, Type] A: Type +>); | ||||
| check_bounds!(CheckBoundsT1<#[a, Type] A: BoolOrIntType +>); | ||||
| check_bounds!(CheckBoundsT2<#[a, Type] A: BundleType +>); | ||||
| check_bounds!(CheckBoundsT3<#[a, Type] A: EnumType +>); | ||||
| check_bounds!(CheckBoundsT4<#[a, Type] A: IntType +>); | ||||
| check_bounds!(CheckBoundsT5<#[a, Type] A: StaticType +>); | ||||
| check_bounds!(CheckBoundsSS0<#[a, Size] A: Size +, #[b, Size] B: Size +>); | ||||
| check_bounds!(CheckBoundsSS1<#[a, Size] A: KnownSize +, #[b, Size] B: Size +>); | ||||
| check_bounds!(CheckBoundsST0<#[a, Size] A: Size +, #[b, Type] B: Type +>); | ||||
| check_bounds!(CheckBoundsST1<#[a, Size] A: KnownSize +, #[b, Type] B: Type +>); | ||||
| check_bounds!(CheckBoundsTS0<#[a, Type] A: Type +, #[b, Size] B: Size +>); | ||||
| check_bounds!(CheckBoundsTS1<#[a, Type] A: BoolOrIntType +, #[b, Size] B: Size +>); | ||||
| check_bounds!(CheckBoundsTS2<#[a, Type] A: BundleType +, #[b, Size] B: Size +>); | ||||
| check_bounds!(CheckBoundsTS3<#[a, Type] A: EnumType +, #[b, Size] B: Size +>); | ||||
| check_bounds!(CheckBoundsTS4<#[a, Type] A: IntType +, #[b, Size] B: Size +>); | ||||
| check_bounds!(CheckBoundsTS5<#[a, Type] A: StaticType +, #[b, Size] B: Size +>); | ||||
| check_bounds!(CheckBoundsTT0<#[a, Type] A: Type +, #[b, Type] B: Type +>); | ||||
| check_bounds!(CheckBoundsTT1<#[a, Type] A: BoolOrIntType +, #[b, Type] B: Type +>); | ||||
| check_bounds!(CheckBoundsTT2<#[a, Type] A: BundleType +, #[b, Type] B: Type +>); | ||||
| check_bounds!(CheckBoundsTT3<#[a, Type] A: EnumType +, #[b, Type] B: Type +>); | ||||
| check_bounds!(CheckBoundsTT4<#[a, Type] A: IntType +, #[b, Type] B: Type +>); | ||||
| check_bounds!(CheckBoundsTT5<#[a, Type] A: StaticType +, #[b, Type] B: Type +>); | ||||
| check_bounds!(CheckBoundsSSS0<#[a, Size] A: Size +, #[b, Size] B: Size +, #[c, Size] C: Size +>); | ||||
| check_bounds!(CheckBoundsSSS1<#[a, Size] A: KnownSize +, #[b, Size] B: Size +, #[c, Size] C: Size +>); | ||||
| check_bounds!(CheckBoundsSST0<#[a, Size] A: Size +, #[b, Size] B: Size +, #[c, Type] C: Type +>); | ||||
| check_bounds!(CheckBoundsSST1<#[a, Size] A: KnownSize +, #[b, Size] B: Size +, #[c, Type] C: Type +>); | ||||
| check_bounds!(CheckBoundsSTS0<#[a, Size] A: Size +, #[b, Type] B: Type +, #[c, Size] C: Size +>); | ||||
| check_bounds!(CheckBoundsSTS1<#[a, Size] A: KnownSize +, #[b, Type] B: Type +, #[c, Size] C: Size +>); | ||||
| check_bounds!(CheckBoundsSTT0<#[a, Size] A: Size +, #[b, Type] B: Type +, #[c, Type] C: Type +>); | ||||
| check_bounds!(CheckBoundsSTT1<#[a, Size] A: KnownSize +, #[b, Type] B: Type +, #[c, Type] C: Type +>); | ||||
| check_bounds!(CheckBoundsTSS0<#[a, Type] A: Type +, #[b, Size] B: Size +, #[c, Size] C: Size +>); | ||||
| check_bounds!(CheckBoundsTSS1<#[a, Type] A: BoolOrIntType +, #[b, Size] B: Size +, #[c, Size] C: Size +>); | ||||
| check_bounds!(CheckBoundsTSS2<#[a, Type] A: BundleType +, #[b, Size] B: Size +, #[c, Size] C: Size +>); | ||||
| check_bounds!(CheckBoundsTSS3<#[a, Type] A: EnumType +, #[b, Size] B: Size +, #[c, Size] C: Size +>); | ||||
| check_bounds!(CheckBoundsTSS4<#[a, Type] A: IntType +, #[b, Size] B: Size +, #[c, Size] C: Size +>); | ||||
| check_bounds!(CheckBoundsTSS5<#[a, Type] A: StaticType +, #[b, Size] B: Size +, #[c, Size] C: Size +>); | ||||
| check_bounds!(CheckBoundsTST0<#[a, Type] A: Type +, #[b, Size] B: Size +, #[c, Type] C: Type +>); | ||||
| check_bounds!(CheckBoundsTST1<#[a, Type] A: BoolOrIntType +, #[b, Size] B: Size +, #[c, Type] C: Type +>); | ||||
| check_bounds!(CheckBoundsTST2<#[a, Type] A: BundleType +, #[b, Size] B: Size +, #[c, Type] C: Type +>); | ||||
| check_bounds!(CheckBoundsTST3<#[a, Type] A: EnumType +, #[b, Size] B: Size +, #[c, Type] C: Type +>); | ||||
| check_bounds!(CheckBoundsTST4<#[a, Type] A: IntType +, #[b, Size] B: Size +, #[c, Type] C: Type +>); | ||||
| check_bounds!(CheckBoundsTST5<#[a, Type] A: StaticType +, #[b, Size] B: Size +, #[c, Type] C: Type +>); | ||||
| check_bounds!(CheckBoundsTTS0<#[a, Type] A: Type +, #[b, Type] B: Type +, #[c, Size] C: Size +>); | ||||
| check_bounds!(CheckBoundsTTS1<#[a, Type] A: BoolOrIntType +, #[b, Type] B: Type +, #[c, Size] C: Size +>); | ||||
| check_bounds!(CheckBoundsTTS2<#[a, Type] A: BundleType +, #[b, Type] B: Type +, #[c, Size] C: Size +>); | ||||
| check_bounds!(CheckBoundsTTS3<#[a, Type] A: EnumType +, #[b, Type] B: Type +, #[c, Size] C: Size +>); | ||||
| check_bounds!(CheckBoundsTTS4<#[a, Type] A: IntType +, #[b, Type] B: Type +, #[c, Size] C: Size +>); | ||||
| check_bounds!(CheckBoundsTTS5<#[a, Type] A: StaticType +, #[b, Type] B: Type +, #[c, Size] C: Size +>); | ||||
| check_bounds!(CheckBoundsTTT0<#[a, Type] A: Type +, #[b, Type] B: Type +, #[c, Type] C: Type +>); | ||||
| check_bounds!(CheckBoundsTTT1<#[a, Type] A: BoolOrIntType +, #[b, Type] B: Type +, #[c, Type] C: Type +>); | ||||
| check_bounds!(CheckBoundsTTT2<#[a, Type] A: BundleType +, #[b, Type] B: Type +, #[c, Type] C: Type +>); | ||||
| check_bounds!(CheckBoundsTTT3<#[a, Type] A: EnumType +, #[b, Type] B: Type +, #[c, Type] C: Type +>); | ||||
| check_bounds!(CheckBoundsTTT4<#[a, Type] A: IntType +, #[b, Type] B: Type +, #[c, Type] C: Type +>); | ||||
| check_bounds!(CheckBoundsTTT5<#[a, Type] A: StaticType +, #[b, Type] B: Type +, #[c, Type] C: Type +>); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue