@@ -303,24 +303,35 @@ void ExprRule::dump() const {
303303 }
304304}
305305
306- std::array<const char *, kMaxGenerics > kGenericPlaceholders = {
307- " T1" , " T2" , " T3" , " T4" , " T5" , " T6" , " T7" , " T8" , " T9" };
308-
309306void ExprRule::validate (const std::string &name) const {
310307 if (src.empty ()) {
311308 llvm::errs () << name << ' \n ' ;
312309 dump ();
313- assert (0 && " Expr rule loaded from IR but has no src" );
310+ llvm::report_fatal_error (" Expr rule loaded from IR but has no src" );
311+ }
312+
313+ if (generics.empty ())
314+ return ;
315+
316+ bool has_generic[kMaxGenerics ] = {false };
317+ for (size_t i = 0 , e = src.size (); i < e; ++i) {
318+ auto pos = src.find (' T' , i);
319+ if (pos == std::string::npos)
320+ break ;
321+ auto ch = pos + 1 < e ? src[pos + 1 ] : ' \0 ' ;
322+ if (ch >= ' 1' && ch <= ' 9' ) {
323+ has_generic[ch - ' 1' ] = true ;
324+ i = pos + 1 ;
325+ }
314326 }
315327
316- for (unsigned i = 0 , e = generics.size (); i < e; ++i) {
317- const char *placeholder = kGenericPlaceholders [i];
318- if (src.find (placeholder) == std::string::npos) {
328+ for (size_t i = 0 , e = generics.size (); i < e; ++i) {
329+ if (!has_generic[i]) {
319330 llvm::errs () << name << ' \n ' ;
320331 dump ();
321- llvm::errs () << " generic " << placeholder
332+ llvm::errs () << " generic T " << (i + 1 )
322333 << " declared but missing from src: " << src << ' \n ' ;
323- assert ( 0 && " Expr rule declares a generic absent from its src" );
334+ llvm::report_fatal_error ( " Absent generic from src" );
324335 }
325336 }
326337}
0 commit comments