Open HarshitaKalani opened 1 week ago
Is a semantic error expected here ?
Yes, when integer is passed to a real argument or vice versa we need to give a semantic error.
Working on it
PROGRAM main
print *, abc(42.9)
CONTAINS
logical function abc(x)
integer, intent(in) :: x
abc = x
end function abc
END PROGRAM
$ lfortran a.f90
LCOMPILERS_ASSERT failed: /home/harshita/Desktop/lfortran/src/libasr/asr_utils.h
function Call_t_body(), line number 5607 at
ASRUtils::check_equal_type(arg_type, orig_arg_type)
ERROR MESSAGE:
ASRUtils::check_equal_type(r32, i32)
Traceback (most recent call last):
Binary file "/home/harshita/Desktop/lfortran/src/bin/lfortran", in _start
File "./csu/../csu/libc-start.c", line 392, in __libc_start_main
File "./csu/../sysdeps/nptl/libc_start_call_main.h", line 58, in __libc_start_call_main
File "/home/harshita/Desktop/lfortran/src/bin/lfortran.cpp", line 2919, in main
return main_app(argc, argv);
File "/home/harshita/Desktop/lfortran/src/bin/lfortran.cpp", line 2862, in main_app(int, char**)
err = compile_src_to_object_file(arg_file, tmp_o, false,
File "/home/harshita/Desktop/lfortran/src/bin/lfortran.cpp", line 1251, in (anonymous namespace)::compile_src_to_object_file(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool, LCompilers::CompilerOptions&, LCompilers::PassManager&)
result = fe.get_asr2(input, lm, diagnostics);
File "/home/harshita/Desktop/lfortran/src/lfortran/fortran_evaluator.cpp", line 304, in LCompilers::FortranEvaluator::get_asr2(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, LCompilers::LocationManager&, LCompilers::diag::Diagnostics&)
Result<ASR::TranslationUnit_t*> res2 = get_asr3(*ast, diagnostics);
File "/home/harshita/Desktop/lfortran/src/lfortran/fortran_evaluator.cpp", line 350, in LCompilers::FortranEvaluator::get_asr3(LCompilers::LFortran::AST::TranslationUnit_t&, LCompilers::diag::Diagnostics&)
compiler_options.symtab_only, compiler_options);
File "/home/harshita/Desktop/lfortran/src/lfortran/semantics/ast_to_asr.cpp", line 107, in LCompilers::LFortran::ast_to_asr(Allocator&, LCompilers::LFortran::AST::TranslationUnit_t&, LCompilers::diag::Diagnostics&, LCompilers::SymbolTable*, bool, LCompilers::CompilerOptions&)
instantiate_types, instantiate_symbols, entry_functions, entry_function_arguments_mapping, data_structure);
File "/home/harshita/Desktop/lfortran/src/lfortran/semantics/ast_body_visitor.cpp", line 3884, in LCompilers::LFortran::body_visitor(Allocator&, LCompilers::LFortran::AST::TranslationUnit_t&, LCompilers::diag::Diagnostics&, LCompilers::ASR::asr_t*, LCompilers::CompilerOptions&, std::map<unsigned long, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, LCompilers::ASR::ttype_t*, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, LCompilers::ASR::ttype_t*> > >, std::less<unsigned long>, std::allocator<std::pair<unsigned long const, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, LCompilers::ASR::ttype_t*, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, LCompilers::ASR::ttype_t*> > > > > >&, std::map<unsigned long, LCompilers::ASR::symbol_t*, std::less<unsigned long>, std::allocator<std::pair<unsigned long const, LCompilers::ASR::symbol_t*> > >&, std::map<unsigned long, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<unsigned long>, std::allocator<std::pair<unsigned long const, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >&, std::map<unsigned int, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, LCompilers::ASR::ttype_t*, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, LCompilers::ASR::ttype_t*> > >, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, LCompilers::ASR::ttype_t*, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, LCompilers::ASR::ttype_t*> > > > > >&, std::map<unsigned int, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, LCompilers::ASR::symbol_t*, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, LCompilers::ASR::symbol_t*> > >, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, LCompilers::ASR::symbol_t*, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, LCompilers::ASR::symbol_t*> > > > > >&, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<LCompilers::LFortran::AST::stmt_t*, std::allocator<LCompilers::LFortran::AST::stmt_t*> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<LCompilers::LFortran::AST::stmt_t*, std::allocator<LCompilers::LFortran::AST::stmt_t*> > > > >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<LCompilers::LFortran::AST::stmt_t*, std::allocator<LCompilers::LFortran::AST::stmt_t*> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<LCompilers::LFortran::AST::stmt_t*, std::allocator<LCompilers::LFortran::AST::stmt_t*> > > > > > > >&, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<int, std::allocator<int> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<int, std::allocator<int> > > > >&, std::vector<LCompilers::ASR::stmt_t*, std::allocator<LCompilers::ASR::stmt_t*> >&)
b.visit_TranslationUnit(ast);
File "/home/harshita/Desktop/lfortran/src/lfortran/semantics/ast_body_visitor.cpp", line 146, in LCompilers::LFortran::BodyVisitor::visit_TranslationUnit(LCompilers::LFortran::AST::TranslationUnit_t const&)
visit_ast(*x.m_items[i]);
File "/home/harshita/Desktop/lfortran/src/lfortran/ast.h", line 4884, in LCompilers::LFortran::AST::BaseVisitor<LCompilers::LFortran::BodyVisitor>::visit_ast(LCompilers::LFortran::AST::ast_t const&)
void visit_ast(const ast_t &b) { visit_ast_t(b, self()); }
File "/home/harshita/Desktop/lfortran/src/lfortran/ast.h", line 4841, in void LCompilers::LFortran::AST::visit_ast_t<LCompilers::LFortran::BodyVisitor>(LCompilers::LFortran::AST::ast_t const&, LCompilers::LFortran::BodyVisitor&)
case astType::mod: { v.visit_mod((const mod_t &)x); return; }
File "/home/harshita/Desktop/lfortran/src/lfortran/ast.h", line 4887, in LCompilers::LFortran::AST::BaseVisitor<LCompilers::LFortran::BodyVisitor>::visit_mod(LCompilers::LFortran::AST::mod_t const&)
void visit_mod(const mod_t &b) { visit_mod_t(b, self()); }
File "/home/harshita/Desktop/lfortran/src/lfortran/ast.h", line 4474, in void LCompilers::LFortran::AST::visit_mod_t<LCompilers::LFortran::BodyVisitor>(LCompilers::LFortran::AST::mod_t const&, LCompilers::LFortran::BodyVisitor&)
case modType::Program: { v.visit_Program((const Program_t &)x); return; }
File "/home/harshita/Desktop/lfortran/src/lfortran/semantics/ast_body_visitor.cpp", line 1598, in LCompilers::LFortran::BodyVisitor::visit_Program(LCompilers::LFortran::AST::Program_t const&)
transform_stmts(body, x.n_body, x.m_body);
File "/home/harshita/Desktop/lfortran/src/lfortran/semantics/ast_body_visitor.cpp", line 117, in LCompilers::LFortran::BodyVisitor::transform_stmts(LCompilers::Vec<LCompilers::ASR::stmt_t*>&, unsigned long, LCompilers::LFortran::AST::stmt_t**)
this->visit_stmt(*m_body[i]);
File "/home/harshita/Desktop/lfortran/src/lfortran/ast.h", line 4930, in LCompilers::LFortran::AST::BaseVisitor<LCompilers::LFortran::BodyVisitor>::visit_stmt(LCompilers::LFortran::AST::stmt_t const&)
void visit_stmt(const stmt_t &b) { visit_stmt_t(b, self()); }
File "/home/harshita/Desktop/lfortran/src/lfortran/ast.h", line 4601, in void LCompilers::LFortran::AST::visit_stmt_t<LCompilers::LFortran::BodyVisitor>(LCompilers::LFortran::AST::stmt_t const&, LCompilers::LFortran::BodyVisitor&)
case stmtType::Print: { v.visit_Print((const Print_t &)x); return; }
File "/home/harshita/Desktop/lfortran/src/lfortran/semantics/ast_body_visitor.cpp", line 3169, in LCompilers::LFortran::BodyVisitor::visit_Print(LCompilers::LFortran::AST::Print_t const&)
visit_expr(*x.m_values[i]);
File "/home/harshita/Desktop/lfortran/src/lfortran/ast.h", line 4982, in LCompilers::LFortran::AST::BaseVisitor<LCompilers::LFortran::BodyVisitor>::visit_expr(LCompilers::LFortran::AST::expr_t const&)
void visit_expr(const expr_t &b) { visit_expr_t(b, self()); }
File "/home/harshita/Desktop/lfortran/src/lfortran/ast.h", line 4639, in void LCompilers::LFortran::AST::visit_expr_t<LCompilers::LFortran::BodyVisitor>(LCompilers::LFortran::AST::expr_t const&, LCompilers::LFortran::BodyVisitor&)
case exprType::FuncCallOrArray: { v.visit_FuncCallOrArray((const FuncCallOrArray_t &)x); return; }
File "/home/harshita/Desktop/lfortran/src/lfortran/semantics/ast_common_visitor.h", line 7136, in LCompilers::LFortran::CommonVisitor<LCompilers::LFortran::BodyVisitor>::visit_FuncCallOrArray(LCompilers::LFortran::AST::FuncCallOrArray_t const&)
tmp = create_FunctionCallWithASTNode(x, v, args);
File "/home/harshita/Desktop/lfortran/src/lfortran/semantics/ast_common_visitor.h", line 4916, in LCompilers::LFortran::CommonVisitor<LCompilers::LFortran::BodyVisitor>::create_FunctionCallWithASTNode(LCompilers::LFortran::AST::FuncCallOrArray_t const&, LCompilers::ASR::symbol_t*, LCompilers::Vec<LCompilers::ASR::call_arg_t>&, bool)
return create_Function(x.base.base.loc, args, v);
File "/home/harshita/Desktop/lfortran/src/lfortran/semantics/ast_common_visitor.h", line 4867, in LCompilers::LFortran::CommonVisitor<LCompilers::LFortran::BodyVisitor>::create_Function(LCompilers::Location const&, LCompilers::Vec<LCompilers::ASR::call_arg_t>&, LCompilers::ASR::symbol_t*)
return ASRUtils::make_FunctionCall_t_util(al, loc, v, nullptr,
File "/home/harshita/Desktop/lfortran/src/libasr/asr_utils.h", line 5651, in LCompilers::ASRUtils::make_FunctionCall_t_util(Allocator&, LCompilers::Location const&, LCompilers::ASR::symbol_t*, LCompilers::ASR::symbol_t*, LCompilers::ASR::call_arg_t*, unsigned long, LCompilers::ASR::ttype_t*, LCompilers::ASR::expr_t*, LCompilers::ASR::expr_t*, bool)
Call_t_body(al, a_name, a_args, n_args, a_dt, nullptr, false, nopass);
File "/home/harshita/Desktop/lfortran/src/libasr/asr_utils.h", line 5607, in LCompilers::ASRUtils::Call_t_body(Allocator&, LCompilers::ASR::symbol_t*, LCompilers::ASR::call_arg_t*, unsigned long, LCompilers::ASR::expr_t*, LCompilers::ASR::stmt_t**, bool, bool)
LCOMPILERS_ASSERT_MSG( ASRUtils::check_equal_type(arg_type, orig_arg_type),
File "./stdlib/./stdlib/abort.c", line 79, in abort
File "./signal/../sysdeps/posix/raise.c", line 26, in raise
File "./nptl/./nptl/pthread_kill.c", line 43, in pthread_kill
Binary file "/lib/x86_64-linux-gnu/libc.so.6", in <invalid>
Abort: Signal SIGABRT (abort) received
Aborted (core dumped)
diff --git a/src/runtime/builtin/lfortran_intrinsic_builtin.f90 b/src/runtime/builtin/lfortran_intrinsic_builtin.f90
index e39cf4725..9291bbbd2 100644
--- a/src/runtime/builtin/lfortran_intrinsic_builtin.f90
+++ b/src/runtime/builtin/lfortran_intrinsic_builtin.f90
@@ -1,6 +1,11 @@
module lfortran_intrinsic_builtin
implicit none
+interface present
+procedure :: present_i
+procedure :: present_r
+end interface
+
interface
integer function int(x, kind)
@@ -13,10 +18,14 @@ interface
integer, optional, intent(in) :: kind
end function
- logical function present(x)
+ logical function present_i(x)
integer, optional, intent(in) :: x
end function
+ logical function present_r(x)
+ real, optional, intent(in) :: x
+ end function
+
logical function is_iostat_eor(i) result(r)
integer, intent(in) :: i
end function
@@ -39,4 +48,5 @@ interface
end interface
+
end module