Skip to content

Issue with shadowing and binary functions #997

@rok-cesnovar

Description

@rok-cesnovar

This is a continuation of the discussion with @WardBrian here: #995 (comment)

Long story short, this model's generated code fails to compile:

transformed data {
   real multiply;
   real a = multiply(0, 1);   
}

with

examples/test/test.hpp: In constructor ‘test_model_namespace::test_model::test_model(stan::io::var_context&, unsigned int, std::ostream*)’:
examples/test/test.hpp:66:24: error: expression cannot be used as a function
   66 |       a = multiply(0, 1);
      |                        ^

We allow shadowing and it works with nullary and unary functions. For example this model works fine:

transformed data {
   real log;
   real a = log(10);
   real e;
   real f = e();
   real positive_infinity;
   real g = positive_infinity();  
}

Solutions to this are:
a) add stan::math namespace to a function if there is a variable with the same name used in the model
b) add stan::math namespace to all Stan Math function calls (this probably doesnt work as we may fallback to std:: in some cases)
c) if a function is shadowed it can no longer be used as a function in that model (@WardBrian mentioned this is what Python does)
d) disallow shadowing for binary functions (we have to check functions with 3+ args as well)

This is not a new issue for this release, its been present since we allowed shadowing.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions