Emit C++ Warning if "Activating" constant arguments
- Dominant language
- LLVM
- Stars
- 1.7k
- Forks
- 188
- Avg merge
- 1d 22h
- Merged PRs (30d)
- 26
Description
Passing an argument as constant but then introducing it into the differentiated path does not emit a warning in C++.
@wsmoses mentioned today there are warnings in Julia for this common error pattern, it would be nice to warn also in C++ compilation.
Wrong usage: https://fwd.gymni.ch/S07AKJ warning wanted :)
C++ code
```C++
#include
#include
inline int enzyme_dup;
inline int enzyme_dupnoneed;
inline int enzyme_in;
inline int enzyme_out;
inline int enzyme_const;
struct S {
S(double r) : x(r) {};
double x = 0.0;
};
extern double __enzyme_fwddiff(void*, int, std::list&, int, ...);
//extern double __enzyme_autodiff(void*, int, std::list&, int, ...);
double test_modify_list(std::list & vals, double const & x) {
// simplified function for comparison:
//return x*x;
// what we want to do
vals.front().x = x;
// iterate over list
double result = 0.0;
for (const auto& val : vals) {
result += val.x * val.x;
}
return result;
}
int main ()
{
std::list vals = {S{1.0}, S{2.0}, S{3.0}};
double x = 3.0;
double dx = 1.0;
double ret = __enzyme_fwddiff((void*)test_modify_list, enzyme_const, vals, enzyme_dup, &x, &dx);
// FIXME: ret is 0 instead of 6
std::cout << "FW test_modify_list ret=" << ret << " x=" << x << " dx=" << dx << "\n";
}
```
Correct example: https://fwd.gymni.ch/cJlqgX
C++ code
```C++
#include
#include
inline int enzyme_dup;
inline int enzyme_dupnoneed;
inline int enzyme_in;
inline int enzyme_out;
inline int enzyme_const;
struct S {
S(double r) : x(r) {};
double x = 0.0;
};
extern double __enzyme_fwddiff(void*, int, std::list&, std::list&, int, ...);
//extern double __enzyme_autodiff(void*, int, std::list&, int, ...);
double test_modify_list(std::list & vals, double const & x) {
// simplified function for comparison:
//return x*x;
// what we want to do
vals.front().x = x;
// iterate over list
double result = 0.0;
for (const auto& val : vals) {
result += val.x * val.x;
}
return result;
}
int main ()
{
std::list vals = {S{1.0}, S{2.0}, S{3.0}};
std::list dvals = {S{0.0}, S{0.0}, S{0.0}};
double x = 3.0;
double dx = 1.0;
double ret = __enzyme_fwddiff((void*)test_modify_list, enzyme_dup, vals, dvals, enzyme_dup, &x, &dx);
// FIXME: ret is 0 instead of 6
std::cout << "FW test_modify_list ret=" << ret << " x=" << x << " dx=" << dx << "\n";
}
```
Contributor guide
Assessment
This issue has not been assessed yet.