-
Notifications
You must be signed in to change notification settings - Fork 170
Missing Feature C Backend: Paradoxical Code Generation For Functions #1610
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
The issue I think is in our unused function pass that only removes functions returning a value, but leaves functions that return None (subroutines). We have to fix it. |
I think subroutines are supported in |
I tried to generate the C code with the given snippet and throws me the following error:
This is expected as |
C now support passes and I think the following C generated code is fine for: from lpython import i32
def test_pow():
a: i32
a = i32(pow(2, 2))
def test_pow_1(a: i32, b: i32) -> i32:
res: i32
res = i32(pow(a, b))
return res
def main0():
test_pow()
c: i32
c = test_pow_1(1, 2)
def foo():
d: i32 = test_pow_1(1, 2)
main0() C code
#include <complex.h>
#include <inttypes.h>
#include <math.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <lfortran_intrinsics.h>
#define ASSERT(cond) \
{ \
if (!(cond)) { \
printf("%s%s", "ASSERT failed: ", __FILE__); \
printf("%s%s", "\nfunction ", __func__); \
printf("%s%d%s", "(), line number ", __LINE__, " at \n"); \
printf("%s%s", #cond, "\n"); \
exit(1); \
} \
}
#define ASSERT_MSG(cond, msg) \
{ \
if (!(cond)) { \
printf("%s%s", "ASSERT failed: ", __FILE__); \
printf("%s%s", "\nfunction ", __func__); \
printf("%s%d%s", "(), line number ", __LINE__, " at \n"); \
printf("%s%s", #cond, "\n"); \
printf("%s", "ERROR MESSAGE:\n"); \
printf("%s%s", msg, "\n"); \
exit(1); \
} \
}
struct dimension_descriptor
{
int32_t lower_bound, length;
};
// Implementations
double __lpython_overloaded_0__pow(int32_t x, int32_t y)
{
double _lpython_return_variable;
_lpython_return_variable = (double)(pow(x, y));
return _lpython_return_variable;
}
float _lfortran_caimag(float complex x);
double _lfortran_zaimag(double complex x);
void test_pow()
{
int32_t a;
a = (int32_t)(__lpython_overloaded_0__pow(2, 2));
}
int32_t test_pow_1(int32_t a, int32_t b)
{
int32_t _lpython_return_variable;
int32_t res;
res = (int32_t)(__lpython_overloaded_0__pow(a, b));
_lpython_return_variable = res;
return _lpython_return_variable;
}
void main0()
{
int32_t c;
test_pow();
c = test_pow_1(1, 2);
}
void _lpython_main_program()
{
main0();
}
int main(int argc, char* argv[])
{
_lpython_main_program();
return 0;
} We can see that |
python c backend generates paradoxical code for functions by return value:
Example:
Run
python --show-c
Output:
As you can see foo does not need to be generated (Only function call it)
That unexpected behavior will return it self when declare return val as None:
def foo() -> None:
But won't return(Not generating c code for foo) when returns an actual value like:
def foo() -> i32:
etc...
The text was updated successfully, but these errors were encountered: