mirror of
https://github.com/Ed94/gencpp.git
synced 2024-12-22 07:44:45 -08:00
Add restrict specifier support for C
This commit is contained in:
parent
28aa2c4dec
commit
46e816d7ce
@ -23,6 +23,7 @@ enum Specifier : u32
|
|||||||
Spec_Ptr,
|
Spec_Ptr,
|
||||||
Spec_Ref,
|
Spec_Ref,
|
||||||
Spec_Register,
|
Spec_Register,
|
||||||
|
Spec_Restrict,
|
||||||
Spec_RValue,
|
Spec_RValue,
|
||||||
Spec_Static,
|
Spec_Static,
|
||||||
Spec_Thread_Local,
|
Spec_Thread_Local,
|
||||||
@ -56,6 +57,7 @@ inline Str spec_to_str( Specifier type )
|
|||||||
{ "*", sizeof( "*" ) - 1 },
|
{ "*", sizeof( "*" ) - 1 },
|
||||||
{ "&", sizeof( "&" ) - 1 },
|
{ "&", sizeof( "&" ) - 1 },
|
||||||
{ "register", sizeof( "register" ) - 1 },
|
{ "register", sizeof( "register" ) - 1 },
|
||||||
|
{ "restrict", sizeof( "restrict" ) - 1 },
|
||||||
{ "&&", sizeof( "&&" ) - 1 },
|
{ "&&", sizeof( "&&" ) - 1 },
|
||||||
{ "static", sizeof( "static" ) - 1 },
|
{ "static", sizeof( "static" ) - 1 },
|
||||||
{ "thread_local", sizeof( "thread_local" ) - 1 },
|
{ "thread_local", sizeof( "thread_local" ) - 1 },
|
||||||
|
@ -83,6 +83,7 @@ enum TokType : u32
|
|||||||
Tok_Spec_Mutable,
|
Tok_Spec_Mutable,
|
||||||
Tok_Spec_NeverInline,
|
Tok_Spec_NeverInline,
|
||||||
Tok_Spec_Override,
|
Tok_Spec_Override,
|
||||||
|
Tok_Spec_Restrict,
|
||||||
Tok_Spec_Static,
|
Tok_Spec_Static,
|
||||||
Tok_Spec_ThreadLocal,
|
Tok_Spec_ThreadLocal,
|
||||||
Tok_Spec_Volatile,
|
Tok_Spec_Volatile,
|
||||||
@ -188,6 +189,7 @@ inline Str toktype_to_str( TokType type )
|
|||||||
{ "mutable", sizeof( "mutable" ) - 1 },
|
{ "mutable", sizeof( "mutable" ) - 1 },
|
||||||
{ "neverinline", sizeof( "neverinline" ) - 1 },
|
{ "neverinline", sizeof( "neverinline" ) - 1 },
|
||||||
{ "override", sizeof( "override" ) - 1 },
|
{ "override", sizeof( "override" ) - 1 },
|
||||||
|
{ "restrict", sizeof( "restrict" ) - 1 },
|
||||||
{ "static", sizeof( "static" ) - 1 },
|
{ "static", sizeof( "static" ) - 1 },
|
||||||
{ "thread_local", sizeof( "thread_local" ) - 1 },
|
{ "thread_local", sizeof( "thread_local" ) - 1 },
|
||||||
{ "volatile", sizeof( "volatile" ) - 1 },
|
{ "volatile", sizeof( "volatile" ) - 1 },
|
||||||
|
@ -1217,9 +1217,9 @@ Code parse_complicated_definition( TokType which )
|
|||||||
Token name = parse_identifier(nullptr);
|
Token name = parse_identifier(nullptr);
|
||||||
_ctx->parser.Scope->Name = name.Text;
|
_ctx->parser.Scope->Name = name.Text;
|
||||||
|
|
||||||
Code result = parse_variable_after_name(ModuleFlag_None, NullCode, NullCode, type, name.Text);
|
CodeVar result = parse_variable_after_name(ModuleFlag_None, NullCode, NullCode, type, name.Text);
|
||||||
parser_pop(& _ctx->parser);
|
parser_pop(& _ctx->parser);
|
||||||
return result;
|
return (Code) result;
|
||||||
}
|
}
|
||||||
else if ( tok.Type == Tok_Identifier && tokens.Arr[ idx - 3 ].Type == which )
|
else if ( tok.Type == Tok_Identifier && tokens.Arr[ idx - 3 ].Type == which )
|
||||||
{
|
{
|
||||||
@ -4719,13 +4719,16 @@ else if ( currtok.Type == Tok_DeclType )
|
|||||||
{
|
{
|
||||||
Specifier spec = str_to_specifier( currtok.Text );
|
Specifier spec = str_to_specifier( currtok.Text );
|
||||||
|
|
||||||
if ( spec != Spec_Const && spec != Spec_Ptr && spec != Spec_Ref && spec != Spec_RValue )
|
switch (spec ) {
|
||||||
{
|
GEN_PARSER_TYPENAME_ALLOWED_SUFFIX_SPECIFIER_CASES:
|
||||||
log_failure( "Error, invalid specifier used in type definition: %S\n%SB", currtok.Text, parser_to_strbuilder(_ctx->parser) );
|
break;
|
||||||
parser_pop(& _ctx->parser);
|
|
||||||
return InvalidCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
default: {
|
||||||
|
log_failure( "Error, invalid specifier used in type definition: %S\n%SB", currtok.Text, parser_to_strbuilder(_ctx->parser) );
|
||||||
|
parser_pop(& _ctx->parser);
|
||||||
|
return InvalidCode;
|
||||||
|
}
|
||||||
|
}
|
||||||
specs_found[ NumSpecifiers ] = spec;
|
specs_found[ NumSpecifiers ] = spec;
|
||||||
NumSpecifiers++;
|
NumSpecifiers++;
|
||||||
eat( currtok.Type );
|
eat( currtok.Type );
|
||||||
|
@ -97,9 +97,16 @@ case Spec_Global: \
|
|||||||
case Spec_Inline: \
|
case Spec_Inline: \
|
||||||
case Spec_Local_Persist: \
|
case Spec_Local_Persist: \
|
||||||
case Spec_Mutable: \
|
case Spec_Mutable: \
|
||||||
|
case Spec_Restrict: \
|
||||||
case Spec_Static: \
|
case Spec_Static: \
|
||||||
case Spec_Thread_Local: \
|
case Spec_Thread_Local: \
|
||||||
case Spec_Volatile
|
case Spec_Volatile
|
||||||
|
|
||||||
|
#define GEN_PARSER_TYPENAME_ALLOWED_SUFFIX_SPECIFIER_CASES \
|
||||||
|
case Spec_Const: \
|
||||||
|
case Spec_Ptr: \
|
||||||
|
case Spec_Restrict: \
|
||||||
|
case Spec_Ref: \
|
||||||
|
case Spec_RValue
|
||||||
|
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@ NeverInline, neverinline
|
|||||||
Ptr, *
|
Ptr, *
|
||||||
Ref, &
|
Ref, &
|
||||||
Register, register
|
Register, register
|
||||||
|
Restrict, restrict
|
||||||
RValue, &&
|
RValue, &&
|
||||||
Static, static
|
Static, static
|
||||||
Thread_Local, thread_local
|
Thread_Local, thread_local
|
||||||
|
|
@ -72,6 +72,7 @@ Spec_LocalPersist, "local_persist"
|
|||||||
Spec_Mutable, "mutable"
|
Spec_Mutable, "mutable"
|
||||||
Spec_NeverInline, "neverinline"
|
Spec_NeverInline, "neverinline"
|
||||||
Spec_Override, "override"
|
Spec_Override, "override"
|
||||||
|
Spec_Restrict, "restrict"
|
||||||
Spec_Static, "static"
|
Spec_Static, "static"
|
||||||
Spec_ThreadLocal, "thread_local"
|
Spec_ThreadLocal, "thread_local"
|
||||||
Spec_Volatile, "volatile"
|
Spec_Volatile, "volatile"
|
||||||
|
|
@ -20,13 +20,24 @@ int main()
|
|||||||
((gen_Macro){ txt("FOR_SUCC"), MT_Statement, MF_Functional })
|
((gen_Macro){ txt("FOR_SUCC"), MT_Statement, MF_Functional })
|
||||||
));
|
));
|
||||||
|
|
||||||
gen_CodeBody h_passes = gen_parse_file("Cuik/tb/opt/passes.h");
|
gen_CodeBody h_passes = gen_parse_file("Cuik/tb/opt/passes.h\n");
|
||||||
for (gen_Code code = gen_iterator(CodeBody, h_passes, code)) switch (code->Type) {
|
for (gen_Code code = gen_iterator(CodeBody, h_passes, code)) switch (code->Type) {
|
||||||
case CT_Struct:
|
|
||||||
case CT_Function:
|
case CT_Function:
|
||||||
|
gen_log_fmt("%S:\t%S params: %S return type: %S\n"
|
||||||
|
, gen_codetype_to_str(code->Type)
|
||||||
|
, code->Name
|
||||||
|
, gen_strbuilder_to_str( gen_params_to_strbuilder( (gen_CodeParams) code->Params))
|
||||||
|
, gen_strbuilder_to_str( gen_typename_to_strbuilder((gen_CodeTypename) code->ReturnType))
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
|
||||||
case CT_Variable:
|
case CT_Variable:
|
||||||
|
gen_log_fmt("%S:\t%S Type: %S\n", gen_codetype_to_str(code->Type), code->Name, code->ValueType);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CT_Struct:
|
||||||
case CT_Typedef:
|
case CT_Typedef:
|
||||||
gen_log_fmt("%S: %S", gen_codetype_to_str(code->Type), code->Name);
|
gen_log_fmt("%S:\t%S\n", gen_codetype_to_str(code->Type), code->Name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user