@@ -3333,21 +3333,15 @@ void add_var_export(CodeGen *g, ZigVar *var, const char *symbol_name, GlobalLink
3333
3333
global_export->linkage = linkage;
3334
3334
}
3335
3335
3336
- void add_fn_export (CodeGen *g, ZigFn *fn_table_entry, const char *symbol_name, GlobalLinkageId linkage, bool ccc) {
3337
- if (ccc) {
3338
- if (strcmp (symbol_name, " main" ) == 0 && g->libc_link_lib != nullptr ) {
3339
- g->have_c_main = true ;
3340
- } else if (strcmp (symbol_name, " WinMain" ) == 0 &&
3341
- g->zig_target ->os == OsWindows)
3342
- {
3336
+ void add_fn_export (CodeGen *g, ZigFn *fn_table_entry, const char *symbol_name, GlobalLinkageId linkage, CallingConvention cc) {
3337
+ if (cc == CallingConventionC && strcmp (symbol_name, " main" ) == 0 && g->libc_link_lib != nullptr ) {
3338
+ g->have_c_main = true ;
3339
+ } else if (cc == CallingConventionStdcall && g->zig_target ->os == OsWindows) {
3340
+ if (strcmp (symbol_name, " WinMain" ) == 0 ) {
3343
3341
g->have_winmain = true ;
3344
- } else if (strcmp (symbol_name, " WinMainCRTStartup" ) == 0 &&
3345
- g->zig_target ->os == OsWindows)
3346
- {
3342
+ } else if (strcmp (symbol_name, " WinMainCRTStartup" ) == 0 ) {
3347
3343
g->have_winmain_crt_startup = true ;
3348
- } else if (strcmp (symbol_name, " DllMainCRTStartup" ) == 0 &&
3349
- g->zig_target ->os == OsWindows)
3350
- {
3344
+ } else if (strcmp (symbol_name, " DllMainCRTStartup" ) == 0 ) {
3351
3345
g->have_dllmain_crt_startup = true ;
3352
3346
}
3353
3347
}
@@ -3377,8 +3371,24 @@ static void resolve_decl_fn(CodeGen *g, TldFn *tld_fn) {
3377
3371
}
3378
3372
3379
3373
if (fn_proto->is_export ) {
3380
- bool ccc = (fn_proto->cc == CallingConventionUnspecified || fn_proto->cc == CallingConventionC);
3381
- add_fn_export (g, fn_table_entry, buf_ptr (&fn_table_entry->symbol_name ), GlobalLinkageIdStrong, ccc);
3374
+ switch (fn_proto->cc ) {
3375
+ case CallingConventionAsync: {
3376
+ add_node_error (g, fn_def_node,
3377
+ buf_sprintf (" exported function cannot be async" ));
3378
+ } break ;
3379
+ case CallingConventionC:
3380
+ case CallingConventionNaked:
3381
+ case CallingConventionCold:
3382
+ case CallingConventionStdcall:
3383
+ case CallingConventionUnspecified:
3384
+ // An exported function without a specific calling
3385
+ // convention defaults to C
3386
+ CallingConvention cc = (fn_proto->cc != CallingConventionUnspecified) ?
3387
+ fn_proto->cc : CallingConventionC;
3388
+ add_fn_export (g, fn_table_entry, buf_ptr (&fn_table_entry->symbol_name ),
3389
+ GlobalLinkageIdStrong, cc);
3390
+ break ;
3391
+ }
3382
3392
}
3383
3393
3384
3394
if (!is_extern) {
0 commit comments