Open
Description
python c backend generates paradoxical code for functions by return value:
Example:
from ltypes 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()
main0()
Run
python --show-c
Output:
Note: if any of the above error or warning messages are not clear or are lacking
context please report it to us (we consider that a bug that must be fixed).
#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();
}
void foo()
{
int32_t d = test_pow_1(3, 2);
d = test_pow_1(3, 2);
}
int main(int argc, char* argv[])
{
_lpython_main_program();
return 0;
}
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...