diff --git a/gencpp.vcxproj b/gencpp.vcxproj
index 9567848..6c6d5a1 100644
--- a/gencpp.vcxproj
+++ b/gencpp.vcxproj
@@ -330,6 +330,7 @@
+
diff --git a/project/components/ast.cpp b/project/components/ast.cpp
index b457bb6..572c459 100644
--- a/project/components/ast.cpp
+++ b/project/components/ast.cpp
@@ -1125,7 +1125,10 @@ String AST::to_string()
if ( bitfield_is_equal( u32, ModuleFlags, ModuleFlag::Export ))
result.append( "export " );
- result.append_fmt( "template< %S >\n%S", Params->to_string(), Declaration->to_string() );
+ if ( Params )
+ result.append_fmt( "template< %S >\n%S", Params->to_string(), Declaration->to_string() );
+ else
+ result.append_fmt( "template<>\n%S", Declaration->to_string() );
}
break;
diff --git a/project/components/interface.cpp b/project/components/interface.cpp
index 917aa96..c6fdfd2 100644
--- a/project/components/interface.cpp
+++ b/project/components/interface.cpp
@@ -175,21 +175,21 @@ void define_constants()
#endif
# undef def_constant_code_type
-# pragma push_macro( "forceinline" )
-# pragma push_macro( "global" )
-# pragma push_macro( "internal" )
-# pragma push_macro( "local_persist" )
-# pragma push_macro( "neverinline" )
-# undef forceinline
-# undef global
-# undef internal
-# undef local_persist
-# undef neverinline
# define def_constant_spec( Type_, ... ) \
spec_##Type_ = def_specifiers( num_args(__VA_ARGS__), __VA_ARGS__); \
spec_##Type_.set_global();
+# pragma push_macro("forceinline")
+# pragma push_macro("global")
+# pragma push_macro("internal")
+# pragma push_macro("local_persist")
+# pragma push_macro("neverinline")
+# undef forceinline
+# undef global
+# undef internal
+# undef local_persist
+# undef neverinline
def_constant_spec( const, ESpecifier::Const );
def_constant_spec( consteval, ESpecifier::Consteval );
def_constant_spec( constexpr, ESpecifier::Constexpr );
@@ -218,11 +218,11 @@ void define_constants()
spec_local_persist = def_specifiers( 1, ESpecifier::Local_Persist );
spec_local_persist.set_global();
-# pragma pop_macro( "forceinline" )
-# pragma pop_macro( "global" )
-# pragma pop_macro( "internal" )
-# pragma pop_macro( "local_persist" )
-# pragma pop_macro( "neverinline" )
+# pragma pop_macro("forceinline")
+# pragma pop_macro("global")
+# pragma pop_macro("internal")
+# pragma pop_macro("local_persist")
+# pragma pop_macro("neverinline")
# undef def_constant_spec
}
diff --git a/project/components/interface.parsing.cpp b/project/components/interface.parsing.cpp
index 020cdaa..1f2c3ed 100644
--- a/project/components/interface.parsing.cpp
+++ b/project/components/interface.parsing.cpp
@@ -775,6 +775,18 @@ namespace Parser
if (left)
move_forward();
+
+ if ( current == '=' )
+ {
+ token.Length++;
+ token.IsAssign = true;
+ // token.Flags |= TokFlags::Assignment;
+ // token.Type = TokType::Assign_Multiply;
+
+ if ( left )
+ move_forward();
+ }
+
goto FoundToken;
}
case ';':
@@ -973,7 +985,14 @@ namespace Parser
if ( left )
{
- if ( current == '/' )
+ if ( current == '=' )
+ {
+ // token.Type = TokeType::Assign_Divide;
+ move_forward();
+ token.Length++;
+ token.IsAssign = true;
+ }
+ else if ( current == '/' )
{
token.Type = TokType::Comment;
token.Length = 2;
@@ -2820,7 +2839,7 @@ CodeOperator parse_operator_after_ret_type(
if ( currtok.Text[1] == '=' )
op = Assign_Add;
- if ( currtok.Text[1] == '+' )
+ else if ( currtok.Text[1] == '+' )
op = Increment;
else
@@ -2840,7 +2859,7 @@ CodeOperator parse_operator_after_ret_type(
break;
}
- if ( currtok.Text[1] == '=' )
+ else if ( currtok.Text[1] == '=' )
op = Assign_Subtract;
else
@@ -3196,6 +3215,12 @@ CodeParam parse_params( bool use_template_capture )
Context.pop();
return { nullptr };
}
+ else if ( check ( TokType::Operator ) && currtok.Text[0] == '>' )
+ {
+ eat( TokType::Operator );
+ Context.pop();
+ return { nullptr };
+ }
CodeType type = { nullptr };
Code value = { nullptr };
diff --git a/project/components/interface.upfront.cpp b/project/components/interface.upfront.cpp
index 5b602f7..b198745 100644
--- a/project/components/interface.upfront.cpp
+++ b/project/components/interface.upfront.cpp
@@ -35,17 +35,17 @@ OpValidateResult operator__validate( OperatorT op, CodeParam params_code, CodeTy
return OpValidateResult::Fail; \
}
-# define check_param_eq_ret() \
- if ( ! is_member_symbol && params_code->ValueType != ret_type ) \
- { \
- log_failure("gen_def_operator: operator%s requires first parameter to equal return type\n" \
- "param types: %s\n" \
- "return type: %s", \
- to_str(op), \
- params_code.debug_str(), \
- ret_type.debug_str() \
- ); \
- return OpValidateResult::Fail; \
+# define check_param_eq_ret() \
+ if ( ! is_member_symbol && ! params_code->ValueType.is_equal( ret_type) ) \
+ { \
+ log_failure("gen::def_operator: operator%s requires first parameter to equal return type\n" \
+ "param types: %s\n" \
+ "return type: %s", \
+ to_str(op).Ptr, \
+ params_code.debug_str(), \
+ ret_type.debug_str() \
+ ); \
+ return OpValidateResult::Fail; \
}
#pragma endregion Helper Macros
@@ -947,6 +947,7 @@ CodeOperator def_operator( OperatorT op, StrC nspace
result = (CodeOperator) make_code();
result->Name = get_cached_string( { str_len(name), name } );
result->ModuleFlags = mflags;
+ result->Op = op;
if ( body )
{
diff --git a/project/helpers/helper.hpp b/project/helpers/helper.hpp
index 2c80e9b..49fb4fb 100644
--- a/project/helpers/helper.hpp
+++ b/project/helpers/helper.hpp
@@ -32,7 +32,7 @@ CodeBody gen_ecode( char const* path )
CodeEnum enum_code = parse_enum(gen::token_fmt_impl((3 + 1) / 2, "entries", (StrC)enum_entries, "enum Type : u32 { NumTypes };"));
-#pragma push_macro( "local_persist" )
+#pragma push_macro("local_persist")
#undef local_persist
CodeFn to_str = parse_function( token_fmt( "entries", (StrC)to_str_entries, stringize(
StrC to_str( Type type )
@@ -45,7 +45,7 @@ CodeBody gen_ecode( char const* path )
return lookup[ type ];
}
)));
-#pragma pop_macro( "local_persist" )
+#pragma pop_macro("local_persist")
CodeNS nspace = def_namespace( name(ECode), def_namespace_body( args( enum_code, to_str ) ) );
CodeUsing code_t = def_using( name(CodeT), def_type( name(ECode::Type) ) );
@@ -86,7 +86,7 @@ CodeBody gen_eoperator( char const* path )
};
)));
-#pragma push_macro( "local_persist" )
+#pragma push_macro("local_persist")
#undef local_persist
CodeFn to_str = parse_function(token_fmt("entries", (StrC)to_str_entries, stringize(
StrC to_str( Type op )
@@ -99,7 +99,7 @@ CodeBody gen_eoperator( char const* path )
return lookup[ op ];
}
)));
-#pragma pop_macro( "local_persist" )
+#pragma pop_macro("local_persist")
CodeNS nspace = def_namespace( name(EOperator), def_namespace_body( args( enum_code, to_str ) ) );
@@ -148,11 +148,11 @@ CodeBody gen_especifier( char const* path )
}
)));
-#pragma push_macro( "local_persist" )
-#pragma push_macro( "do_once_start" )
-#pragma push_macro( "do_once_end" )
-#pragma push_macro( "forceinline" )
-#pragma push_macro( "neverinline" )
+#pragma push_macro("local_persist")
+#pragma push_macro("do_once_start")
+#pragma push_macro("do_once_end")
+#pragma push_macro("forceinline")
+#pragma push_macro("neverinline")
#undef local_persist
#undef do_once_start
#undef do_once_end
@@ -197,11 +197,11 @@ CodeBody gen_especifier( char const* path )
return Invalid;
}
)));
-#pragma pop_macro( "local_persist" )
-#pragma pop_macro( "do_once_start" )
-#pragma pop_macro( "do_once_end" )
-#pragma pop_macro( "forceinline" )
-#pragma pop_macro( "neverinline" )
+#pragma pop_macro("local_persist")
+#pragma pop_macro("do_once_start")
+#pragma pop_macro("do_once_end")
+#pragma pop_macro("forceinline")
+#pragma pop_macro("neverinline")
CodeNS nspace = def_namespace( name(ESpecifier), def_namespace_body( args( enum_code, is_trailing, to_str, to_type ) ) );
@@ -260,10 +260,10 @@ CodeBody gen_etoktype( char const* etok_path, char const* attr_path )
attribute_define_entries.append( "\n");
}
-#pragma push_macro( "GEN_DEFINE_ATTRIBUTE_TOKENS" )
+#pragma push_macro("GEN_DEFINE_ATTRIBUTE_TOKENS")
#undef GEN_DEFINE_ATTRIBUTE_TOKENS
CodeDefine attribute_entires_def = def_define( name(GEN_DEFINE_ATTRIBUTE_TOKENS), attribute_define_entries );
-#pragma pop_macro( "GEN_DEFINE_ATTRIBUTE_TOKENS" )
+#pragma pop_macro("GEN_DEFINE_ATTRIBUTE_TOKENS")
CodeEnum enum_code = parse_enum(token_fmt("entries", (StrC)enum_entries, "attribute_toks", (StrC)attribute_entries, stringize(
enum Type : u32
@@ -274,9 +274,9 @@ CodeBody gen_etoktype( char const* etok_path, char const* attr_path )
};
)));
-#pragma push_macro( "local_persist" )
-#pragma push_macro( "do_once_start" )
-#pragma push_macro( "do_once_end" )
+#pragma push_macro("local_persist")
+#pragma push_macro("do_once_start")
+#pragma push_macro("do_once_end")
#undef local_persist
#undef do_once_start
#undef do_once_end
@@ -320,9 +320,9 @@ CodeBody gen_etoktype( char const* etok_path, char const* attr_path )
return Invalid;
}
)));
-#pragma pop_macro( "local_persist" )
-#pragma pop_macro( "do_once_start" )
-#pragma pop_macro( "do_once_end" )
+#pragma pop_macro("local_persist")
+#pragma pop_macro("do_once_start")
+#pragma pop_macro("do_once_end")
CodeNS nspace = def_namespace( name(ETokType), def_namespace_body( args( attribute_entires_def, enum_code, to_str, to_type ) ) );
CodeUsing td_toktype = def_using( name(TokType), def_type( name(ETokType::Type) ) );