The recently added weak attribute shows a small difference in behavior compared to c:
------------------------ #include <stdio.h> __attribute__((weak)) int test(); int main() { printf("%p %d\n", &test, (int)&test); return 0; } ------------------------ (nil) 0 ------------------------ import core.stdc.stdio, gcc.attribute; @attribute("weak") void test(); int main() { printf("%p %d\n", &test, cast(int)&test); return 0; } ------------------------ => unresolved symbol test The problem is that we mark the function decl as TREE_STATIC. The C compiler marks it as DECL_EXTERNAL instead. Interestingly for variables things work as 'expected': --------------------------------------------- __gshared @attribute("weak") extern int test; => address (nil) / 0 __gshared @attribute("weak") int test; => real address --------------------------------------------- So: 1) Can we mark int test(); as DECL_EXTERNAL or am I missing something? 2) Is this change correct or is there a better way: @@ -1717,7 +1717,7 @@ setup_symbol_storage (Dsymbol *dsym, tree decl, bool public_p) } VarDeclaration *vd = rd ? rd->isVarDeclaration() : NULL; - if (!local_p || (vd && vd->storage_class & STCextern)) + if (!local_p || (vd && vd->storage_class & STCextern) || (rd && rd->isFuncDeclaration() && !rd->isFuncDeclaration()->fbody)) { DECL_EXTERNAL (decl) = 1; TREE_STATIC (decl) = 0;