diff --git a/core/src/main/java/org/lflang/generator/c/CParameterGenerator.java b/core/src/main/java/org/lflang/generator/c/CParameterGenerator.java index 273f058d57..bcf03ea33a 100644 --- a/core/src/main/java/org/lflang/generator/c/CParameterGenerator.java +++ b/core/src/main/java/org/lflang/generator/c/CParameterGenerator.java @@ -1,5 +1,6 @@ package org.lflang.generator.c; +import java.util.HashSet; import org.lflang.ast.ASTUtils; import org.lflang.generator.CodeBuilder; import org.lflang.generator.ParameterInstance; @@ -41,7 +42,14 @@ public static String getInitializer(ParameterInstance p) { public static String generateDeclarations( TypeParameterizedReactor reactor, CTypes types, boolean suppressLineDirectives) { CodeBuilder code = new CodeBuilder(); + // Allow derived classes to override base class parameter definitions. + // Assume that the validator has checked that types match. + var declared = new HashSet(); for (Parameter parameter : ASTUtils.allParameters(reactor.reactor())) { + // If the parameter name has been seen already, assume it is an override of the default value + // in a derived class. The validator should check. + if (declared.contains(parameter.getName())) continue; + declared.add(parameter.getName()); code.prSourceLineNumber(parameter, suppressLineDirectives); code.pr( types.getTargetType(reactor.resolveType(ASTUtils.getInferredType(parameter))) diff --git a/test/C/src/ParameterOverride.lf b/test/C/src/ParameterOverride.lf new file mode 100644 index 0000000000..b586281dee --- /dev/null +++ b/test/C/src/ParameterOverride.lf @@ -0,0 +1,16 @@ +target C + +reactor A(x: int = 0) { + reaction(startup) {= + if (self->x != 1) { + lf_print_error_and_exit("x is %d. Should be 1.", self->x); + } + =} +} + +reactor B(x: int = 1) extends A { +} + +main reactor { + b = new B() +}