diff --git a/CMakeLists.txt b/CMakeLists.txt index 809fc806..30e407da 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,8 +16,16 @@ if(CODON_JUPYTER) endif() set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility-inlines-hidden -pedantic -Wno-return-type-c-linkage -Wno-gnu-zero-variadic-macro-arguments") -set(CMAKE_CXX_FLAGS_DEBUG "-g -fno-limit-debug-info") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") +if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -fvisibility-inlines-hidden -Wno-return-type-c-linkage -Wno-gnu-zero-variadic-macro-arguments") +else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-return-type") +endif() +set(CMAKE_CXX_FLAGS_DEBUG "-g") +if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-limit-debug-info") +endif() set(CMAKE_CXX_FLAGS_RELEASE "-O3") include_directories(.) diff --git a/codon/app/main.cpp b/codon/app/main.cpp index ae830ccf..de3da5c9 100644 --- a/codon/app/main.cpp +++ b/codon/app/main.cpp @@ -84,10 +84,11 @@ std::unique_ptr processSource(const std::vector & bool standalone) { llvm::cl::opt input(llvm::cl::Positional, llvm::cl::desc(""), llvm::cl::init("-")); + auto regs = llvm::cl::getRegisteredOptions(); llvm::cl::opt optMode( llvm::cl::desc("optimization mode"), llvm::cl::values( - clEnumValN(Debug, "debug", + clEnumValN(Debug, regs.find("debug") != regs.end() ? "default" : "debug", "Turn off compiler optimizations and show backtraces"), clEnumValN(Release, "release", "Turn on compiler optimizations and disable debug info")), diff --git a/codon/parser/visitors/simplify/simplify_expr.cpp b/codon/parser/visitors/simplify/simplify_expr.cpp index ae2bf528..f17bec5a 100644 --- a/codon/parser/visitors/simplify/simplify_expr.cpp +++ b/codon/parser/visitors/simplify/simplify_expr.cpp @@ -500,9 +500,9 @@ void SimplifyVisitor::visit(CallExpr *expr) { ctx->add(SimplifyItem::Var, varName, varName); var = N(varName); ctx->addBlock(); // prevent tmp vars from being toplevel vars - ex = N( - transform(N(clone(g->loops[0].vars), clone(var), nullptr, true)), - transform(ex)); + auto head = + transform(N(clone(g->loops[0].vars), clone(var), nullptr, true)); + ex = N(head, transform(ex)); ctx->popBlock(); } std::vector body; diff --git a/codon/parser/visitors/simplify/simplify_stmt.cpp b/codon/parser/visitors/simplify/simplify_stmt.cpp index d1e420ce..ff09cf15 100644 --- a/codon/parser/visitors/simplify/simplify_stmt.cpp +++ b/codon/parser/visitors/simplify/simplify_stmt.cpp @@ -180,7 +180,9 @@ void SimplifyVisitor::visit(WhileStmt *stmt) { transform(N(N(breakVar), N(true), nullptr, true)); } ctx->loops.push_back(breakVar); // needed for transforming break in loop..else blocks - StmtPtr whileStmt = N(transform(cond), transform(stmt->suite)); + + cond = transform(cond); + StmtPtr whileStmt = N(cond, transform(stmt->suite)); ctx->loops.pop_back(); if (stmt->elseSuite && stmt->elseSuite->firstInBlock()) { resultStmt = @@ -232,7 +234,8 @@ void SimplifyVisitor::visit(ForStmt *stmt) { ctx->addBlock(); if (auto i = stmt->var->getId()) { ctx->add(SimplifyItem::Var, i->value, ctx->generateCanonicalName(i->value)); - forStmt = N(transform(stmt->var), clone(iter), transform(stmt->suite), + auto var = transform(stmt->var); + forStmt = N(var, clone(iter), transform(stmt->suite), nullptr, decorator, ompArgs); } else { std::string varName = ctx->cache->getTemporaryVar("for"); @@ -259,8 +262,8 @@ void SimplifyVisitor::visit(ForStmt *stmt) { void SimplifyVisitor::visit(IfStmt *stmt) { seqassert(stmt->cond, "invalid if statement"); - resultStmt = N(transform(stmt->cond), transform(stmt->ifSuite), - transform(stmt->elseSuite)); + auto cond = transform(stmt->cond); + resultStmt = N(cond, transform(stmt->ifSuite), transform(stmt->elseSuite)); } void SimplifyVisitor::visit(MatchStmt *stmt) { diff --git a/codon/parser/visitors/translate/translate.cpp b/codon/parser/visitors/translate/translate.cpp index 33779418..ebeee5bb 100644 --- a/codon/parser/visitors/translate/translate.cpp +++ b/codon/parser/visitors/translate/translate.cpp @@ -91,8 +91,10 @@ void TranslateVisitor::visit(IdExpr *expr) { } void TranslateVisitor::visit(IfExpr *expr) { - result = make(expr, transform(expr->cond), transform(expr->ifexpr), - transform(expr->elsexpr)); + auto cond = transform(expr->cond); + auto ifexpr = transform(expr->ifexpr); + auto elsexpr = transform(expr->elsexpr); + result = make(expr, cond, ifexpr, elsexpr); } void TranslateVisitor::visit(CallExpr *expr) { diff --git a/codon/parser/visitors/translate/translate_ctx.cpp b/codon/parser/visitors/translate/translate_ctx.cpp index 690c0b84..7d7589c2 100644 --- a/codon/parser/visitors/translate/translate_ctx.cpp +++ b/codon/parser/visitors/translate/translate_ctx.cpp @@ -21,14 +21,14 @@ std::shared_ptr TranslateContext::find(const std::string &name) c return t; std::shared_ptr ret = nullptr; auto tt = cache->typeCtx->find(name); - if (tt->isType() && tt->type->canRealize()) { + if (tt && tt->isType() && tt->type->canRealize()) { ret = std::make_shared(TranslateItem::Type, bases[0]); seqassert(in(cache->classes, tt->type->getClass()->name) && in(cache->classes[tt->type->getClass()->name].realizations, name), "cannot find type realization {}", name); ret->handle.type = cache->classes[tt->type->getClass()->name].realizations[name]->ir; - } else if (tt->type->getFunc() && tt->type->canRealize()) { + } else if (tt && tt->type->getFunc() && tt->type->canRealize()) { ret = std::make_shared(TranslateItem::Func, bases[0]); seqassert( in(cache->functions, tt->type->getFunc()->ast->name) && diff --git a/test/parser/simplify_stmt.codon b/test/parser/simplify_stmt.codon index d849b7dd..28791469 100644 --- a/test/parser/simplify_stmt.codon +++ b/test/parser/simplify_stmt.codon @@ -381,6 +381,8 @@ print log(5.5) #: 1.70475 #%% import_c_dylib,barebones from internal.dlopen import dlext RT = "./libcodonrt." + dlext() +if RT[-3:] == ".so": + RT = "build/" + RT[2:] from C import RT.seq_str_int(int) -> str as sp print sp(65) #: 65