diff --git a/include/artic/ast.h b/include/artic/ast.h index 6db1f7a0..c7936d70 100644 --- a/include/artic/ast.h +++ b/include/artic/ast.h @@ -11,6 +11,7 @@ #include "artic/cast.h" #include "artic/token.h" #include "artic/symbol.h" +#include "artic/prim_types.h" namespace thorin { class Def; @@ -298,18 +299,12 @@ struct AttrList : public NamedAttr { /// Primitive type (integer, float, ...). struct PrimType : public Type { enum Tag { - Bool, - I8, - I16, - I32, - I64, - U8, - U16, - U32, - U64, - F16, - F32, - F64, +#define DECL_ENUM(name, str) name, + + ALL_PRIM_TYPES(DECL_ENUM) + +#undef DECL_ENUM + Error }; diff --git a/include/artic/prim_types.h b/include/artic/prim_types.h new file mode 100644 index 00000000..83509045 --- /dev/null +++ b/include/artic/prim_types.h @@ -0,0 +1,275 @@ +#ifndef ARTIC_PRIM_TYPES_H +#define ARTIC_PRIM_TYPES_H + +#define INT_SIGNED_TYPES(M) \ + M(I1, "i1") \ + M(I2, "i2") \ + M(I3, "i3") \ + M(I4, "i4") \ + M(I5, "i5") \ + M(I6, "i6") \ + M(I7, "i7") \ + M(I8, "i8") \ + M(I9, "i9") \ + M(I10, "i10") \ + M(I11, "i11") \ + M(I12, "i12") \ + M(I13, "i13") \ + M(I14, "i14") \ + M(I15, "i15") \ + M(I16, "i16") \ + M(I17, "i17") \ + M(I18, "i18") \ + M(I19, "i19") \ + M(I20, "i20") \ + M(I21, "i21") \ + M(I22, "i22") \ + M(I23, "i23") \ + M(I24, "i24") \ + M(I25, "i25") \ + M(I26, "i26") \ + M(I27, "i27") \ + M(I28, "i28") \ + M(I29, "i29") \ + M(I30, "i30") \ + M(I31, "i31") \ + M(I32, "i32") \ + M(I33, "i33") \ + M(I34, "i34") \ + M(I35, "i35") \ + M(I36, "i36") \ + M(I37, "i37") \ + M(I38, "i38") \ + M(I39, "i39") \ + M(I40, "i40") \ + M(I41, "i41") \ + M(I42, "i42") \ + M(I43, "i43") \ + M(I44, "i44") \ + M(I45, "i45") \ + M(I46, "i46") \ + M(I47, "i47") \ + M(I48, "i48") \ + M(I49, "i49") \ + M(I50, "i50") \ + M(I51, "i51") \ + M(I52, "i52") \ + M(I53, "i53") \ + M(I54, "i54") \ + M(I55, "i55") \ + M(I56, "i56") \ + M(I57, "i57") \ + M(I58, "i58") \ + M(I59, "i59") \ + M(I60, "i60") \ + M(I61, "i61") \ + M(I62, "i62") \ + M(I63, "i63") \ + M(I64, "i64") \ + M(I65, "i65") \ + M(I66, "i66") \ + M(I67, "i67") \ + M(I68, "i68") \ + M(I69, "i69") \ + M(I70, "i70") \ + M(I71, "i71") \ + M(I72, "i72") \ + M(I73, "i73") \ + M(I74, "i74") \ + M(I75, "i75") \ + M(I76, "i76") \ + M(I77, "i77") \ + M(I78, "i78") \ + M(I79, "i79") \ + M(I80, "i80") \ + M(I81, "i81") \ + M(I82, "i82") \ + M(I83, "i83") \ + M(I84, "i84") \ + M(I85, "i85") \ + M(I86, "i86") \ + M(I87, "i87") \ + M(I88, "i88") \ + M(I89, "i89") \ + M(I90, "i90") \ + M(I91, "i91") \ + M(I92, "i92") \ + M(I93, "i93") \ + M(I94, "i94") \ + M(I95, "i95") \ + M(I96, "i96") \ + M(I97, "i97") \ + M(I98, "i98") \ + M(I99, "i99") \ + M(I100, "i100") \ + M(I101, "i101") \ + M(I102, "i102") \ + M(I103, "i103") \ + M(I104, "i104") \ + M(I105, "i105") \ + M(I106, "i106") \ + M(I107, "i107") \ + M(I108, "i108") \ + M(I109, "i109") \ + M(I110, "i110") \ + M(I111, "i111") \ + M(I112, "i112") \ + M(I113, "i113") \ + M(I114, "i114") \ + M(I115, "i115") \ + M(I116, "i116") \ + M(I117, "i117") \ + M(I118, "i118") \ + M(I119, "i119") \ + M(I120, "i120") \ + M(I121, "i121") \ + M(I122, "i122") \ + M(I123, "i123") \ + M(I124, "i124") \ + M(I125, "i125") \ + M(I126, "i126") \ + M(I127, "i127") \ + M(I128, "i128") + +#define INT_UNSIGNED_TYPES(M) \ + M(U1, "u1") \ + M(U2, "u2") \ + M(U3, "u3") \ + M(U4, "u4") \ + M(U5, "u5") \ + M(U6, "u6") \ + M(U7, "u7") \ + M(U8, "u8") \ + M(U9, "u9") \ + M(U10, "u10") \ + M(U11, "u11") \ + M(U12, "u12") \ + M(U13, "u13") \ + M(U14, "u14") \ + M(U15, "u15") \ + M(U16, "u16") \ + M(U17, "u17") \ + M(U18, "u18") \ + M(U19, "u19") \ + M(U20, "u20") \ + M(U21, "u21") \ + M(U22, "u22") \ + M(U23, "u23") \ + M(U24, "u24") \ + M(U25, "u25") \ + M(U26, "u26") \ + M(U27, "u27") \ + M(U28, "u28") \ + M(U29, "u29") \ + M(U30, "u30") \ + M(U31, "u31") \ + M(U32, "u32") \ + M(U33, "u33") \ + M(U34, "u34") \ + M(U35, "u35") \ + M(U36, "u36") \ + M(U37, "u37") \ + M(U38, "u38") \ + M(U39, "u39") \ + M(U40, "u40") \ + M(U41, "u41") \ + M(U42, "u42") \ + M(U43, "u43") \ + M(U44, "u44") \ + M(U45, "u45") \ + M(U46, "u46") \ + M(U47, "u47") \ + M(U48, "u48") \ + M(U49, "u49") \ + M(U50, "u50") \ + M(U51, "u51") \ + M(U52, "u52") \ + M(U53, "u53") \ + M(U54, "u54") \ + M(U55, "u55") \ + M(U56, "u56") \ + M(U57, "u57") \ + M(U58, "u58") \ + M(U59, "u59") \ + M(U60, "u60") \ + M(U61, "u61") \ + M(U62, "u62") \ + M(U63, "u63") \ + M(U64, "u64") \ + M(U65, "u65") \ + M(U66, "u66") \ + M(U67, "u67") \ + M(U68, "u68") \ + M(U69, "u69") \ + M(U70, "u70") \ + M(U71, "u71") \ + M(U72, "u72") \ + M(U73, "u73") \ + M(U74, "u74") \ + M(U75, "u75") \ + M(U76, "u76") \ + M(U77, "u77") \ + M(U78, "u78") \ + M(U79, "u79") \ + M(U80, "u80") \ + M(U81, "u81") \ + M(U82, "u82") \ + M(U83, "u83") \ + M(U84, "u84") \ + M(U85, "u85") \ + M(U86, "u86") \ + M(U87, "u87") \ + M(U88, "u88") \ + M(U89, "u89") \ + M(U90, "u90") \ + M(U91, "u91") \ + M(U92, "u92") \ + M(U93, "u93") \ + M(U94, "u94") \ + M(U95, "u95") \ + M(U96, "u96") \ + M(U97, "u97") \ + M(U98, "u98") \ + M(U99, "u99") \ + M(U100, "u100") \ + M(U101, "u101") \ + M(U102, "u102") \ + M(U103, "u103") \ + M(U104, "u104") \ + M(U105, "u105") \ + M(U106, "u106") \ + M(U107, "u107") \ + M(U108, "u108") \ + M(U109, "u109") \ + M(U110, "u110") \ + M(U111, "u111") \ + M(U112, "u112") \ + M(U113, "u113") \ + M(U114, "u114") \ + M(U115, "u115") \ + M(U116, "u116") \ + M(U117, "u117") \ + M(U118, "u118") \ + M(U119, "u119") \ + M(U120, "u120") \ + M(U121, "u121") \ + M(U122, "u122") \ + M(U123, "u123") \ + M(U124, "u124") \ + M(U125, "u125") \ + M(U126, "u126") \ + M(U127, "u127") \ + M(U128, "u128") + +#define FLOAT_TYPES(M) \ + M(F16, "f16") \ + M(F32, "f32") \ + M(F64, "f64") + +#define ALL_PRIM_TYPES(M) \ + M(Bool, "bool") \ + INT_SIGNED_TYPES(M) \ + INT_UNSIGNED_TYPES(M) \ + FLOAT_TYPES(M) + +#endif // ARTIC_PRIM_TYPES_H \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 350fd919..ab71c8bf 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -14,6 +14,7 @@ add_library(libartic ../include/artic/symbol.h ../include/artic/token.h ../include/artic/types.h + ../include/artic/prim_types.h arena.cpp ast.cpp bind.cpp diff --git a/src/ast.cpp b/src/ast.cpp index 2af4e41e..11a92829 100644 --- a/src/ast.cpp +++ b/src/ast.cpp @@ -3,6 +3,7 @@ #include "artic/ast.h" #include "artic/types.h" +#include "artic/prim_types.h" namespace artic::ast { @@ -12,42 +13,27 @@ bool Ptrn::is_tuple() const { return isa(); } std::string PrimType::tag_to_string(Tag tag) { switch (tag) { - case Bool: return "bool"; - case I8: return "i8"; - case I16: return "i16"; - case I32: return "i32"; - case I64: return "i64"; - case U8: return "u8"; - case U16: return "u16"; - case U32: return "u32"; - case U64: return "u64"; - case F16: return "f16"; - case F32: return "f32"; - case F64: return "f64"; - default: - assert(false); - return ""; +#define DECL_CASE(name, str) \ + case name: return str; + + ALL_PRIM_TYPES(DECL_CASE) + +#undef DECL_CASE + + default: assert(false); return ""; } } PrimType::Tag PrimType::tag_from_token(const Token& token) { static std::unordered_map tag_map{ - std::make_pair("bool", Bool), - std::make_pair("i8", I8), - std::make_pair("i16", I16), - std::make_pair("i32", I32), - std::make_pair("i64", I64), +#define DECL_MAP(name, str) std::make_pair(str, name), - std::make_pair("u8", U8), - std::make_pair("u16", U16), - std::make_pair("u32", U32), - std::make_pair("u64", U64), + ALL_PRIM_TYPES(DECL_MAP) - std::make_pair("f16", F16), - std::make_pair("f32", F32), - std::make_pair("f64", F64), +#undef DECL_MAP }; + auto it = tag_map.find(token.string()); return it != tag_map.end() ? it->second : Error; } diff --git a/src/check.cpp b/src/check.cpp index 95808cc3..b573007d 100644 --- a/src/check.cpp +++ b/src/check.cpp @@ -1,6 +1,7 @@ #include #include "artic/check.h" +#include "artic/prim_types.h" namespace artic { diff --git a/src/emit.cpp b/src/emit.cpp index 86f1d66c..2852923b 100644 --- a/src/emit.cpp +++ b/src/emit.cpp @@ -2109,10 +2109,10 @@ std::tuple, bool> compile( if (!name_binder.run(*program) || !type_checker.run(*program) || !summoner.run(*program)) return std::make_tuple(std::move(program), false); - Emitter emitter(log, world, arena); - emitter.warns_as_errors = warns_as_errors; - if (!emitter.run(*program)) - return std::make_tuple(std::move(program), false); + // Emitter emitter(log, world, arena); + // emitter.warns_as_errors = warns_as_errors; + // if (!emitter.run(*program)) + // return std::make_tuple(std::move(program), false); return std::make_tuple(std::move(program), true); } diff --git a/src/types.cpp b/src/types.cpp index f7e3bf42..20545293 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -589,19 +589,18 @@ std::unordered_map TypeApp::replace_map( bool is_int_type(const Type* type) { if (auto prim_type = type->isa()) { switch (prim_type->tag) { - case ast::PrimType::U8: - case ast::PrimType::U16: - case ast::PrimType::U32: - case ast::PrimType::U64: - case ast::PrimType::I8: - case ast::PrimType::I16: - case ast::PrimType::I32: - case ast::PrimType::I64: - return true; - default: - break; +#define DECL_CASE(name, str) case ast::PrimType::name: + + INT_SIGNED_TYPES(DECL_CASE) + INT_UNSIGNED_TYPES(DECL_CASE) + return true; + +#undef DECL_CASE + + default: break; } } + return false; } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 57fcc34e..42246601 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -17,6 +17,7 @@ add_test(NAME simple_literals2 COMMAND artic --print-ast ${CMAKE_CURRENT_SOURC add_test(NAME simple_literal_if COMMAND artic --print-ast ${CMAKE_CURRENT_SOURCE_DIR}/simple/literal_if.art) add_test(NAME simple_string COMMAND artic --print-ast ${CMAKE_CURRENT_SOURCE_DIR}/simple/string.art) add_test(NAME simple_comments COMMAND artic --print-ast ${CMAKE_CURRENT_SOURCE_DIR}/simple/comments.art) +add_test(NAME simple_ap_ints COMMAND artic --print-ast ${CMAKE_CURRENT_SOURCE_DIR}/simple/arbitrary_precison_ints.art) add_test(NAME simple_fn COMMAND artic --print-ast ${CMAKE_CURRENT_SOURCE_DIR}/simple/fn.art) add_test(NAME simple_match1 COMMAND artic --print-ast ${CMAKE_CURRENT_SOURCE_DIR}/simple/match1.art) add_test(NAME simple_match2 COMMAND artic --print-ast ${CMAKE_CURRENT_SOURCE_DIR}/simple/match2.art) @@ -88,6 +89,7 @@ add_failure_test(NAME failure_comment COMMAND artic ${CMAKE_CURRENT_SOURC add_failure_test(NAME failure_utf8 COMMAND artic ${CMAKE_CURRENT_SOURCE_DIR}/failure/utf8.art) add_failure_test(NAME failure_dots COMMAND artic ${CMAKE_CURRENT_SOURCE_DIR}/failure/dots.art) add_failure_test(NAME failure_char COMMAND artic ${CMAKE_CURRENT_SOURCE_DIR}/failure/char.art) +add_failure_test(NAME failure_ap_ints COMMAND artic ${CMAKE_CURRENT_SOURCE_DIR}/failure/arbitrary_precison_ints.art) add_failure_test(NAME failure_literals COMMAND artic ${CMAKE_CURRENT_SOURCE_DIR}/failure/literals.art) add_failure_test(NAME failure_similar COMMAND artic ${CMAKE_CURRENT_SOURCE_DIR}/failure/similar.art) add_failure_test(NAME failure_string COMMAND artic ${CMAKE_CURRENT_SOURCE_DIR}/failure/string.art) diff --git a/test/failure/arbitrary_precison_ints.art b/test/failure/arbitrary_precison_ints.art new file mode 100644 index 00000000..08acaea1 --- /dev/null +++ b/test/failure/arbitrary_precison_ints.art @@ -0,0 +1,8 @@ +fn test() { + let _: i0 = 0; + let _: u0 = 0; + let _: i129 = 1; + let _: u129 = 1; + let _: i300 = 1; + let _: u300 = 1; +} \ No newline at end of file diff --git a/test/simple/arbitrary_precison_ints.art b/test/simple/arbitrary_precison_ints.art new file mode 100644 index 00000000..49e12c63 --- /dev/null +++ b/test/simple/arbitrary_precison_ints.art @@ -0,0 +1,36 @@ +fn test() { + // minimum widths + let _: i1 = 1; + let _: u1 = 1; + + // byte-aligned + let _: i8 = 1; + let _: i16 = 1; + let _: i32 = 1; + let _: i64 = 1; + + let _: u8 = 1; + let _: u16 = 1; + let _: u32 = 1; + let _: u64 = 1; + + // non-byte-aligned + let _: i3 = 1; + let _: i7 = 1; + let _: i9 = 1; + let _: i17 = 1; + + let _: u3 = 1; + let _: u7 = 1; + let _: u9 = 1; + let _: u17 = 1; + + // >64-bit + let _: i65 = 1; + let _: i127 = 1; + let _: i128 = 1; + + let _: u65 = 1; + let _: u127 = 1; + let _: u128 = 1; +} \ No newline at end of file