@@ -292,14 +292,14 @@ let check_id cf loc tenv id =
292292 Semantic_error. invalid_unnormalized_fn loc |> error
293293 | {kind = `Variable {origin; _} ; type_} :: _ ->
294294 (calculate_autodifftype cf origin type_, type_)
295- | { kind= `UserDefined | `UserDeclared _
295+ | { kind= `UserDefined | `UserExtern _ | ` UserDeclared _
296296 ; type_= UFun (args, rt, FnLpdf _, mem_pattern) }
297297 :: _ ->
298298 let type_ =
299299 UnsizedType. UFun
300300 (args, rt, Fun_kind. suffix_from_name id.name, mem_pattern) in
301301 (calculate_autodifftype cf Functions type_, type_)
302- | {kind = `UserDefined | `UserDeclared _ ; type_} :: _ ->
302+ | {kind = `UserDefined | `UserExtern _ | ` UserDeclared _ ; type_} :: _ ->
303303 (calculate_autodifftype cf Functions type_, type_)
304304
305305let check_variable cf loc tenv id =
@@ -1177,7 +1177,8 @@ let verify_assignable_id loc cf tenv assign_id =
11771177 | {kind = `Variable {origin; global; readonly} ; _} :: _ ->
11781178 (origin, global, readonly)
11791179 | {kind = `StanMath ; _} :: _ -> (MathLibrary , true , false )
1180- | {kind = `UserDefined | `UserDeclared _ ; _} :: _ -> (Functions , true , false )
1180+ | {kind = `UserDefined | `UserDeclared _ | `UserExtern _ ; _} :: _ ->
1181+ (Functions , true , false )
11811182 | _ ->
11821183 Semantic_error. ident_not_in_scope loc assign_id.name
11831184 (Env. nearest_ident tenv assign_id.name)
@@ -1727,11 +1728,13 @@ and verify_fundef_overloaded loc tenv id arg_tys rt =
17271728 verify_unique_signature tenv loc id arg_tys rt;
17281729 verify_name_fresh tenv id ~is_udf: true
17291730
1730- and get_fn_decl_or_defn loc tenv id arg_tys rt body =
1731+ and get_fn_decl_or_defn loc tenv id arg_tys rt body annotations =
17311732 match body with
17321733 | {stmt = Skip ; _} ->
17331734 if exists_matching_fn_declared tenv id arg_tys rt then
17341735 Semantic_error. fn_decl_exists loc id.name |> error
1736+ else if List. mem annotations " extern" ~equal: String. equal then
1737+ `UserExtern id.id_loc
17351738 else `UserDeclared id.id_loc
17361739 | _ -> `UserDefined
17371740
@@ -1909,13 +1912,13 @@ let add_userdefined_functions tenv stmts_opt =
19091912 | Some {stmts; _} ->
19101913 let f tenv (s : Ast.untyped_statement ) =
19111914 match s with
1912- | { stmt= FunDef {returntype; funname; arguments; body; annotations= _ }
1915+ | { stmt= FunDef {returntype; funname; arguments; body; annotations}
19131916 ; smeta= {loc} } ->
19141917 let arg_types = Ast. type_of_arguments arguments in
19151918 verify_fundef_overloaded loc tenv funname arg_types returntype;
19161919 let defined =
19171920 get_fn_decl_or_defn loc tenv funname arg_types returntype body
1918- in
1921+ annotations in
19191922 add_function tenv funname.name
19201923 (UFun
19211924 ( arg_types
0 commit comments