@@ -10,16 +10,16 @@ use super::{get_name, get_names};
1010use rspirv:: dr:: { Block , Function , Instruction , Module , ModuleHeader , Operand } ;
1111use rspirv:: spirv:: { FunctionControl , Op , StorageClass , Word } ;
1212use rustc_data_structures:: fx:: { FxHashMap , FxHashSet } ;
13+ use rustc_errors:: ErrorGuaranteed ;
1314use rustc_session:: Session ;
1415use std:: mem:: take;
1516
1617type FunctionMap = FxHashMap < Word , Function > ;
1718
1819pub fn inline ( sess : & Session , module : & mut Module ) -> super :: Result < ( ) > {
1920 // This algorithm gets real sad if there's recursion - but, good news, SPIR-V bans recursion
20- if module_has_recursion ( sess, module) {
21- return Err ( rustc_errors:: ErrorReported ) ;
22- }
21+ deny_recursion_in_module ( sess, module) ?;
22+
2323 let functions = module
2424 . functions
2525 . iter ( )
@@ -52,7 +52,7 @@ pub fn inline(sess: &Session, module: &mut Module) -> super::Result<()> {
5252 let names = get_names ( module) ;
5353 for f in inlined_dont_inlines {
5454 sess. warn ( & format ! (
55- "Function `{}` has `dont_inline` attribute, but need to be inlined because it has illegal argument or return types" ,
55+ "function `{}` has `dont_inline` attribute, but need to be inlined because it has illegal argument or return types" ,
5656 get_name( & names, f)
5757 ) ) ;
5858 }
@@ -81,7 +81,7 @@ pub fn inline(sess: &Session, module: &mut Module) -> super::Result<()> {
8181}
8282
8383// https://stackoverflow.com/a/53995651
84- fn module_has_recursion ( sess : & Session , module : & Module ) -> bool {
84+ fn deny_recursion_in_module ( sess : & Session , module : & Module ) -> super :: Result < ( ) > {
8585 let func_to_index: FxHashMap < Word , usize > = module
8686 . functions
8787 . iter ( )
@@ -90,7 +90,7 @@ fn module_has_recursion(sess: &Session, module: &Module) -> bool {
9090 . collect ( ) ;
9191 let mut discovered = vec ! [ false ; module. functions. len( ) ] ;
9292 let mut finished = vec ! [ false ; module. functions. len( ) ] ;
93- let mut has_recursion = false ;
93+ let mut has_recursion = None ;
9494 for index in 0 ..module. functions . len ( ) {
9595 if !discovered[ index] && !finished[ index] {
9696 visit (
@@ -111,7 +111,7 @@ fn module_has_recursion(sess: &Session, module: &Module) -> bool {
111111 current : usize ,
112112 discovered : & mut Vec < bool > ,
113113 finished : & mut Vec < bool > ,
114- has_recursion : & mut bool ,
114+ has_recursion : & mut Option < ErrorGuaranteed > ,
115115 func_to_index : & FxHashMap < Word , usize > ,
116116 ) {
117117 discovered[ current] = true ;
@@ -121,11 +121,10 @@ fn module_has_recursion(sess: &Session, module: &Module) -> bool {
121121 let names = get_names ( module) ;
122122 let current_name = get_name ( & names, module. functions [ current] . def_id ( ) . unwrap ( ) ) ;
123123 let next_name = get_name ( & names, module. functions [ next] . def_id ( ) . unwrap ( ) ) ;
124- sess. err ( & format ! (
124+ * has_recursion = Some ( sess. err ( & format ! (
125125 "module has recursion, which is not allowed: `{}` calls `{}`" ,
126126 current_name, next_name
127- ) ) ;
128- * has_recursion = true ;
127+ ) ) ) ;
129128 break ;
130129 }
131130
@@ -159,7 +158,10 @@ fn module_has_recursion(sess: &Session, module: &Module) -> bool {
159158 } )
160159 }
161160
162- has_recursion
161+ match has_recursion {
162+ Some ( err) => Err ( err) ,
163+ None => Ok ( ( ) ) ,
164+ }
163165}
164166
165167fn compute_disallowed_argument_and_return_types (
0 commit comments