2727#include " absl/status/statusor.h"
2828#include " absl/strings/str_format.h"
2929#include " absl/types/span.h"
30+ #include " xls/common/status/ret_check.h"
3031#include " xls/common/status/status_macros.h"
3132#include " xls/dslx/frontend/ast_cloner.h"
3233#include " xls/dslx/frontend/module.h"
@@ -175,9 +176,11 @@ absl::StatusOr<Number*> CreateLiteralFromValue(Module* module, const Span& span,
175176absl::StatusOr<Function*> InsertFunctionSpecialization (
176177 Function* source_function, const ParametricEnv& param_env,
177178 std::string_view specialized_name) {
178- CHECK_NE (source_function, nullptr );
179+ XLS_RET_CHECK_NE (source_function, nullptr )
180+ << " InsertFunctionSpecialization requires a non-null source function" ;
179181 Module* module = source_function->owner ();
180- CHECK_NE (module , nullptr );
182+ XLS_RET_CHECK_NE (module , nullptr ) << absl::StrFormat (
183+ " Source function %s has no owning module" , source_function->identifier ());
181184
182185 if (!source_function->IsParametric ()) {
183186 return absl::InvalidArgumentError (absl::StrFormat (
@@ -186,7 +189,8 @@ absl::StatusOr<Function*> InsertFunctionSpecialization(
186189
187190 auto binding_values =
188191 std::make_shared<absl::flat_hash_map<const NameDef*, InterpValue>>();
189- absl::flat_hash_map<const NameDef*, TypeAnnotation*> binding_types;
192+ auto binding_types =
193+ std::make_shared<absl::flat_hash_map<const NameDef*, TypeAnnotation*>>();
190194 for (ParametricBinding* binding : source_function->parametric_bindings ()) {
191195 std::optional<InterpValue> value = param_env.GetValue (binding->name_def ());
192196 if (!value.has_value ()) {
@@ -196,13 +200,13 @@ absl::StatusOr<Function*> InsertFunctionSpecialization(
196200 }
197201 binding_values->emplace (binding->name_def (), *value);
198202 if (binding->type_annotation () != nullptr ) {
199- binding_types. emplace (binding->name_def (), binding->type_annotation ());
203+ binding_types-> emplace (binding->name_def (), binding->type_annotation ());
200204 }
201205 }
202206
203207 auto make_replacer = [binding_values, binding_types](
204- const absl::flat_hash_map<const NameDef*, NameDef*>*
205- param_name_replacements) -> CloneReplacer {
208+ const absl::flat_hash_map<const NameDef*, NameDef*>*
209+ param_name_replacements) -> CloneReplacer {
206210 return [binding_values, binding_types, param_name_replacements](
207211 const AstNode* original, Module* target_module,
208212 const absl::flat_hash_map<const AstNode*, AstNode*>& old_to_new)
@@ -217,20 +221,19 @@ absl::StatusOr<Function*> InsertFunctionSpecialization(
217221 auto param_it = param_name_replacements->find (def);
218222 if (param_it != param_name_replacements->end ()) {
219223 NameDef* replacement = param_it->second ;
220- return std::optional<AstNode*>(
221- target_module->Make <NameRef>(name_ref->span (),
222- name_ref->identifier (),
223- replacement, name_ref->in_parens ()));
224+ return std::optional<AstNode*>(target_module->Make <NameRef>(
225+ name_ref->span (), name_ref->identifier (), replacement,
226+ name_ref->in_parens ()));
224227 }
225228 }
226229 auto binding_it = binding_values->find (def);
227230 if (binding_it != binding_values->end ()) {
228- XLS_ASSIGN_OR_RETURN (Number * literal,
229- CreateLiteralFromValue (target_module ,
230- name_ref->span (),
231- binding_it->second ));
232- auto type_it = binding_types. find (def);
233- if (type_it != binding_types. end () && type_it->second != nullptr ) {
231+ XLS_ASSIGN_OR_RETURN (
232+ Number * literal ,
233+ CreateLiteralFromValue (target_module, name_ref->span (),
234+ binding_it->second ));
235+ auto type_it = binding_types-> find (def);
236+ if (type_it != binding_types-> end () && type_it->second != nullptr ) {
234237 XLS_ASSIGN_OR_RETURN (TypeAnnotation * cloned_type,
235238 CloneNode<TypeAnnotation>(type_it->second ));
236239 literal->SetTypeAnnotation (cloned_type);
@@ -246,29 +249,31 @@ absl::StatusOr<Function*> InsertFunctionSpecialization(
246249 new_params.reserve (source_function->params ().size ());
247250 absl::flat_hash_map<const NameDef*, NameDef*> param_name_replacements;
248251 for (Param* param : source_function->params ()) {
249- XLS_ASSIGN_OR_RETURN (Param * cloned_param,
250- CloneNode<Param>(param,
251- make_replacer (/* param_name_replacements=*/ nullptr )));
252+ XLS_ASSIGN_OR_RETURN (
253+ Param * cloned_param,
254+ CloneNode<Param>(param,
255+ make_replacer (/* param_name_replacements=*/ nullptr )));
252256 param_name_replacements.emplace (param->name_def (),
253257 cloned_param->name_def ());
254258 new_params.push_back (cloned_param);
255259 }
256260
257261 TypeAnnotation* new_return_type = nullptr ;
258262 if (source_function->return_type () != nullptr ) {
259- XLS_ASSIGN_OR_RETURN (new_return_type,
260- CloneNode<TypeAnnotation>(source_function->return_type (),
261- make_replacer (¶m_name_replacements)));
263+ XLS_ASSIGN_OR_RETURN (
264+ new_return_type,
265+ CloneNode<TypeAnnotation>(source_function->return_type (),
266+ make_replacer (¶m_name_replacements)));
262267 }
263268
264269 XLS_ASSIGN_OR_RETURN (
265270 StatementBlock * new_body,
266271 CloneNode<StatementBlock>(source_function->body (),
267272 make_replacer (¶m_name_replacements)));
268273
269- NameDef* new_name_def = module -> Make <NameDef>(
270- Span::Fake (), std::string (specialized_name),
271- /* definer=*/ nullptr );
274+ NameDef* new_name_def =
275+ module -> Make <NameDef>( Span::Fake (), std::string (specialized_name),
276+ /* definer=*/ nullptr );
272277
273278 SyntheticSpanAllocator span_allocator (module , source_function,
274279 specialized_name);
0 commit comments