Seems the question has been solved, here is the changes of treelang/parse.y, just for fun :-)
$ diff treelang/parse.y treelang/parse_new.y -u --- treelang/parse.y 2004-01-08 15:50:46.000000000 +0800 +++ treelang/parse_new.y 2006-04-13 18:00:34.390625000 +0800 @@ -48,6 +48,7 @@ #include "tm.h" #include "diagnostic.h" #include "timevar.h" +#include "tree.h" #include "treelang.h" #include "treetree.h" @@ -182,7 +183,7 @@ ; variable_def: -storage typename NAME init_opt SEMICOLON { +storage_opt typename NAME init_opt SEMICOLON { struct prod_token_parm_item* tok; struct prod_token_parm_item *prod; tok = $3; @@ -225,6 +226,15 @@ } ; +storage_opt: +/* Nil. */ { + $$ = 0; +} +|storage { + $$ = $1; +} +; + storage: STATIC |AUTOMATIC @@ -254,7 +264,7 @@ ; function_prototype: -storage typename NAME LEFT_PARENTHESIS parameters RIGHT_PARENTHESIS SEMICOLON +storage_opt typename NAME LEFT_PARENTHESIS parameters RIGHT_PARENTHESIS SEMIC ON { struct prod_token_parm_item* tok; struct prod_token_parm_item *prod; struct prod_token_parm_item *type; @@ -951,6 +961,11 @@ { struct prod_token_parm_item* stg_class; stg_class = STORAGE_CLASS_TOKEN (prod); + if(stg_class==NULL_TREE) + { + STORAGE_CLASS (prod) = EXTERNAL_DEFINITION_STORAGE; + return; + } switch (stg_class->type) { case STATIC: