summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/expand/derive.cpp17
-rw-r--r--src/hir/dump.cpp2
-rw-r--r--src/hir/from_ast.cpp2
-rw-r--r--src/hir/hir.cpp12
-rw-r--r--src/hir/hir.hpp2
-rw-r--r--src/hir/type.cpp2
-rw-r--r--src/hir_expand/closures.cpp6
-rw-r--r--src/hir_typeck/expr_cs.cpp4
-rw-r--r--src/hir_typeck/helpers.cpp2
-rw-r--r--src/mir/dump.cpp2
-rw-r--r--src/parse/root.cpp13
11 files changed, 38 insertions, 26 deletions
diff --git a/src/expand/derive.cpp b/src/expand/derive.cpp
index ef77afcd..173afa81 100644
--- a/src/expand/derive.cpp
+++ b/src/expand/derive.cpp
@@ -10,6 +10,7 @@
#include "../ast/ast.hpp"
#include "../ast/expr.hpp"
#include "../ast/crate.hpp"
+#include <hir/hir.hpp> // ABI_RUST
template<typename T>
static inline ::std::vector<T> vec$(T v1) {
@@ -243,7 +244,7 @@ class Deriver_Debug:
AST::Function fcn(
sp,
AST::GenericParams(),
- "rust", false, false, false,
+ ABI_RUST, false, false, false,
ret_type,
vec$(
::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "self"), TypeRef(TypeRef::TagReference(), sp, false, TypeRef("Self", 0xFFFF)) ),
@@ -420,7 +421,7 @@ class Deriver_PartialEq:
AST::Function fcn(
sp,
AST::GenericParams(),
- "rust", false, false, false,
+ ABI_RUST, false, false, false,
TypeRef(sp, CORETYPE_BOOL),
vec$(
::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "self"), TypeRef(TypeRef::TagReference(), sp, false, TypeRef("Self", 0xFFFF)) ),
@@ -606,7 +607,7 @@ class Deriver_PartialOrd:
AST::Function fcn(
sp,
AST::GenericParams(),
- "rust", false, false, false,
+ ABI_RUST, false, false, false,
TypeRef(sp, path_option_ordering),
vec$(
::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "self"), TypeRef(TypeRef::TagReference(), sp, false, TypeRef("Self", 0xFFFF)) ),
@@ -861,7 +862,7 @@ class Deriver_Eq:
AST::Function fcn(
sp,
AST::GenericParams(),
- "rust", false, false, false,
+ ABI_RUST, false, false, false,
TypeRef(TypeRef::TagUnit(), sp),
vec$(
::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "self"), TypeRef(TypeRef::TagReference(), sp, false, TypeRef("Self", 0xFFFF)) )
@@ -1003,7 +1004,7 @@ class Deriver_Ord:
AST::Function fcn(
sp,
AST::GenericParams(),
- "rust", false, false, false,
+ ABI_RUST, false, false, false,
TypeRef(sp, path_ordering),
vec$(
::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "self"), TypeRef(TypeRef::TagReference(), sp, false, TypeRef("Self", 0xFFFF)) ),
@@ -1248,7 +1249,7 @@ class Deriver_Clone:
AST::Function fcn(
sp,
AST::GenericParams(),
- "rust", false, false, false,
+ ABI_RUST, false, false, false,
TypeRef("Self", 0xFFFF),
vec$(
::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "self"), TypeRef(TypeRef::TagReference(), sp, false, TypeRef("Self", 0xFFFF)) )
@@ -1430,7 +1431,7 @@ class Deriver_Default:
AST::Function fcn(
sp,
AST::GenericParams(),
- "rust", false, false, false,
+ ABI_RUST, false, false, false,
TypeRef("Self", 0xFFFF),
{}
);
@@ -1510,7 +1511,7 @@ class Deriver_Hash:
AST::Function fcn(
sp,
AST::GenericParams(),
- "rust", false, false, false,
+ ABI_RUST, false, false, false,
TypeRef(TypeRef::TagUnit(), sp),
vec$(
::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "self"), TypeRef(TypeRef::TagReference(), sp, false, TypeRef("Self", 0xFFFF)) ),
diff --git a/src/hir/dump.cpp b/src/hir/dump.cpp
index 90c7c7c1..90b0d1c9 100644
--- a/src/hir/dump.cpp
+++ b/src/hir/dump.cpp
@@ -198,7 +198,7 @@ namespace {
m_os << "const ";
if( item.m_unsafe )
m_os << "unsafe ";
- if( item.m_abi != "rust" )
+ if( item.m_abi != ABI_RUST )
m_os << "extern \"" << item.m_abi << "\" ";
m_os << "fn " << p.get_name() << item.m_params.fmt_args() << "(";
for(const auto& arg : item.m_args)
diff --git a/src/hir/from_ast.cpp b/src/hir/from_ast.cpp
index fb0b3186..a6550b07 100644
--- a/src/hir/from_ast.cpp
+++ b/src/hir/from_ast.cpp
@@ -738,7 +738,7 @@
mv$(args) // TODO: e.info.is_variadic
};
if( f.m_abi == "" )
- f.m_abi = "rust";
+ f.m_abi = ABI_RUST;
return ::HIR::TypeRef( ::HIR::TypeRef::Data::make_Function( mv$(f) ) );
),
(Generic,
diff --git a/src/hir/hir.cpp b/src/hir/hir.cpp
index 293827d8..404674ac 100644
--- a/src/hir/hir.cpp
+++ b/src/hir/hir.cpp
@@ -160,8 +160,16 @@ namespace {
return matches_type_int(params, *le.inner, *re.inner, ty_res, expand_generic);
),
(Function,
- DEBUG("TODO: Compare " << left << " and " << right);
- return false;
+ if( le.is_unsafe != re.is_unsafe )
+ return false;
+ if( le.m_abi != re.m_abi )
+ return false;
+ if( le.m_arg_types.size() != re.m_arg_types.size() )
+ return false;
+ for( unsigned int i = 0; i < le.m_arg_types.size(); i ++ )
+ if( !matches_type_int(params, le.m_arg_types[i], re.m_arg_types[i], ty_res, expand_generic) )
+ return false;
+ return matches_type_int(params, *le.m_rettype, *re.m_rettype, ty_res, expand_generic);
),
(Closure,
return le.node == re.node;
diff --git a/src/hir/hir.hpp b/src/hir/hir.hpp
index 73e1fd95..0c6a5206 100644
--- a/src/hir/hir.hpp
+++ b/src/hir/hir.hpp
@@ -25,6 +25,8 @@
#include <hir/generic_params.hpp>
#include <hir/crate_ptr.hpp>
+#define ABI_RUST "Rust"
+
namespace HIR {
class Crate;
diff --git a/src/hir/type.cpp b/src/hir/type.cpp
index abad9757..15100c15 100644
--- a/src/hir/type.cpp
+++ b/src/hir/type.cpp
@@ -338,7 +338,7 @@ Ordering HIR::TypeRef::ord(const ::HIR::TypeRef& x) const
ORD(*te.inner, *xe.inner);
ORD(te.size_val, xe.size_val);
if( te.size_val == ~0u )
- assert(!"TOD: Compre array types with non-resolved sizes");
+ TODO(Span(), "Compre array types with non-resolved sizes");
return OrdEqual;
),
(Slice,
diff --git a/src/hir_expand/closures.cpp b/src/hir_expand/closures.cpp
index ca117c5d..1c719a77 100644
--- a/src/hir_expand/closures.cpp
+++ b/src/hir_expand/closures.cpp
@@ -290,7 +290,7 @@ namespace {
make_map1(
::std::string("call_once"), ::HIR::TraitImpl::ImplEnt< ::HIR::Function> { false, ::HIR::Function {
::HIR::Function::Receiver::Value,
- "rust", false, false,
+ ABI_RUST, false, false,
{},
make_vec2(
::std::make_pair(::HIR::Pattern { {false, ::HIR::PatternBinding::Type::Move, "self", 0}, {} }, ::HIR::TypeRef("Self", 0xFFFF)),
@@ -323,7 +323,7 @@ namespace {
make_map1(
::std::string("call_mut"), ::HIR::TraitImpl::ImplEnt< ::HIR::Function> { false, ::HIR::Function {
::HIR::Function::Receiver::BorrowUnique,
- "rust", false, false,
+ ABI_RUST, false, false,
{},
make_vec2(
::std::make_pair(
@@ -357,7 +357,7 @@ namespace {
make_map1(
::std::string("call"), ::HIR::TraitImpl::ImplEnt< ::HIR::Function> { false, ::HIR::Function {
::HIR::Function::Receiver::BorrowShared,
- "rust", false, false,
+ ABI_RUST, false, false,
{},
make_vec2(
::std::make_pair(
diff --git a/src/hir_typeck/expr_cs.cpp b/src/hir_typeck/expr_cs.cpp
index 5220bdcd..e7fac500 100644
--- a/src/hir_typeck/expr_cs.cpp
+++ b/src/hir_typeck/expr_cs.cpp
@@ -1440,7 +1440,7 @@ namespace {
::HIR::FunctionType ft {
false,
- "rust",
+ ABI_RUST,
box$( ::HIR::TypeRef( node.m_path.clone(), ::HIR::TypeRef::TypePathBinding::make_Struct(&s) ) ),
{}
};
@@ -1463,7 +1463,7 @@ namespace {
::HIR::FunctionType ft {
false,
- "rust",
+ ABI_RUST,
box$( ::HIR::TypeRef( ::HIR::GenericPath(mv$(enum_path), e.m_params.clone()), ::HIR::TypeRef::TypePathBinding::make_Enum(&enm) ) ),
{}
};
diff --git a/src/hir_typeck/helpers.cpp b/src/hir_typeck/helpers.cpp
index 313d6269..c0830810 100644
--- a/src/hir_typeck/helpers.cpp
+++ b/src/hir_typeck/helpers.cpp
@@ -1078,7 +1078,7 @@ bool TraitResolution::find_trait_impls(const Span& sp,
}
// NOTE: unsafe or non-rust ABI functions aren't valid
- if( e.m_abi != "rust" || e.is_unsafe ) {
+ if( e.m_abi != ABI_RUST || e.is_unsafe ) {
DEBUG("- No magic impl, wrong ABI or unsafe in " << type);
return false;
}
diff --git a/src/mir/dump.cpp b/src/mir/dump.cpp
index aa17a651..0023d2b6 100644
--- a/src/mir/dump.cpp
+++ b/src/mir/dump.cpp
@@ -99,7 +99,7 @@ namespace {
m_os << "const ";
if( item.m_unsafe )
m_os << "unsafe ";
- if( item.m_abi != "rust" )
+ if( item.m_abi != ABI_RUST )
m_os << "extern \"" << item.m_abi << "\" ";
m_os << "fn ";
if( m_short_item_name )
diff --git a/src/parse/root.cpp b/src/parse/root.cpp
index e9bd4855..dbb079d7 100644
--- a/src/parse/root.cpp
+++ b/src/parse/root.cpp
@@ -14,6 +14,7 @@
#include "parseerror.hpp"
#include "common.hpp"
#include <cassert>
+#include <hir/hir.hpp> // ABI_RUST - TODO: Move elsewhere?
template<typename T>
Spanned<T> get_spanned(TokenStream& lex, ::std::function<T()> f) {
@@ -610,7 +611,7 @@ AST::Trait Parse_TraitDef(TokenStream& lex, const AST::MetaItems& meta_items)
bool fn_is_const = false;
bool fn_is_unsafe = false;
- ::std::string abi = "rust";
+ ::std::string abi = ABI_RUST;
switch(tok.type())
{
case TOK_RWORD_STATIC: {
@@ -1008,7 +1009,7 @@ void Parse_Impl_Item(TokenStream& lex, AST::Impl& impl)
GET_TOK(tok, lex);
}
- ::std::string abi = "rust";
+ ::std::string abi = ABI_RUST;
bool fn_is_unsafe = false;
bool fn_is_const = false;
switch(tok.type())
@@ -1465,13 +1466,13 @@ void Parse_Use(TokenStream& lex, ::std::function<void(AST::UseStmt, ::std::strin
GET_CHECK_TOK(tok, lex, TOK_RWORD_FN);
GET_CHECK_TOK(tok, lex, TOK_IDENT);
item_name = tok.str();
- item_data = ::AST::Item( Parse_FunctionDefWithCode(lex, "rust", false, true,true/*unsafe,const*/) );
+ item_data = ::AST::Item( Parse_FunctionDefWithCode(lex, ABI_RUST, false, true,true/*unsafe,const*/) );
break;
case TOK_RWORD_FN:
GET_CHECK_TOK(tok, lex, TOK_IDENT);
item_name = tok.str();
// - self not allowed, not prototype
- item_data = ::AST::Item( Parse_FunctionDefWithCode(lex, "rust", false, false,true/*unsafe,const*/) );
+ item_data = ::AST::Item( Parse_FunctionDefWithCode(lex, ABI_RUST, false, false,true/*unsafe,const*/) );
break;
default:
throw ParseError::Unexpected(lex, tok, {TOK_IDENT, TOK_RWORD_FN});
@@ -1525,7 +1526,7 @@ void Parse_Use(TokenStream& lex, ::std::function<void(AST::UseStmt, ::std::strin
GET_CHECK_TOK(tok, lex, TOK_IDENT);
item_name = mv$( tok.str() );
// - self not allowed, not prototype
- item_data = ::AST::Item( Parse_FunctionDefWithCode(lex, "rust", false, true,false/*unsafe,const*/) );
+ item_data = ::AST::Item( Parse_FunctionDefWithCode(lex, ABI_RUST, false, true,false/*unsafe,const*/) );
break;
// `unsafe trait`
case TOK_RWORD_TRAIT:
@@ -1547,7 +1548,7 @@ void Parse_Use(TokenStream& lex, ::std::function<void(AST::UseStmt, ::std::strin
GET_CHECK_TOK(tok, lex, TOK_IDENT);
item_name = tok.str();
// - self not allowed, not prototype
- item_data = ::AST::Item( Parse_FunctionDefWithCode(lex, "rust", false, false,false/*unsafe,const*/) );
+ item_data = ::AST::Item( Parse_FunctionDefWithCode(lex, ABI_RUST, false, false,false/*unsafe,const*/) );
break;
// `type`
case TOK_RWORD_TYPE: