diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/expand/derive.cpp | 17 | ||||
-rw-r--r-- | src/hir/dump.cpp | 2 | ||||
-rw-r--r-- | src/hir/from_ast.cpp | 2 | ||||
-rw-r--r-- | src/hir/hir.cpp | 12 | ||||
-rw-r--r-- | src/hir/hir.hpp | 2 | ||||
-rw-r--r-- | src/hir/type.cpp | 2 | ||||
-rw-r--r-- | src/hir_expand/closures.cpp | 6 | ||||
-rw-r--r-- | src/hir_typeck/expr_cs.cpp | 4 | ||||
-rw-r--r-- | src/hir_typeck/helpers.cpp | 2 | ||||
-rw-r--r-- | src/mir/dump.cpp | 2 | ||||
-rw-r--r-- | src/parse/root.cpp | 13 |
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:
|