🐘

Lua ver1.1をビルドしたときのエラーについて

2021/09/26に公開

はじめに

以前、以下のような記事を書きました。

https://zenn.dev/saitoyutaka/articles/4618aa762247d5

clients/lib/iolib.cのファイルに以下のような修正を加えました。

diff --git a/clients/lib/iolib.c b/clients/lib/iolib.c
index b972124..ec2ef3c 100644
--- a/clients/lib/iolib.c
+++ b/clients/lib/iolib.c
@@ -11,14 +11,19 @@ char *rcs_iolib="$Id: iolib.c,v 1.4 1994/04/25 20:11:23 celes Exp $";
 #include <ctype.h>
 #include <sys/stat.h>
 #ifdef __GNUC__
-#include <floatingpoint.h>
+// #include <floatingpoint.h>
 #endif
 
 #include "mm.h"
 
 #include "lua.h"
 
-static FILE *in=stdin, *out=stdout;
+// static FILE *in=stdin, *out=stdout;
+static FILE *in, *out;
+
+ __attribute__((constructor)) void initHw(void){
+  in=stdin, out=stdout;
+}

この修正の以下の部分について調べました。

static FILE *in=stdin, *out=stdout;

修正しない時に発生するエラー(initializer element is not constant)

clients/lib/iolib.c
static FILE *in=stdin, *out=stdout;

上記のままで、ビルドを行うと以下のエラーが出ます。

In file included from iolib.c:10:
iolib.c:21:17: error: initializer element is not constant
   21 | static FILE *in=stdin, *out=stdout;
      |                 ^~~~~
iolib.c:21:29: error: initializer element is not constant
   21 | static FILE *in=stdin, *out=stdout;
      |                             ^~~~~~

Lua Ver1.1がリリースされた当時のコンパイラ(gcc Ver??)では
これでコンパイルができたのでしょう。

https://godbolt.org/ というページを見つけたので、
ここで一番古いバージョンのgccを使って確認をしてみました。
(x86-64 gcc 4.1.2)
これでコンパイルができるのかなと思ったら、エラーになりました。

https://godbolt.org/z/75Yn9a8ea

Lua 1.1 was released on 08 Jul 1994
書かれているので、おそらく当時使用していたgcc のバージョンは
2.4.4あたりでしょうか。
http://ftp.tsukuba.wide.ad.jp/software/gcc/old-releases/gcc-2/gcc-2.4.5.tar.bz2の中のChangeLogをみたら以下のような記載がありました。

Sat Jun 19 03:57:57 1993 Richard Stallman

  • Version 2.4.4 released.

でもこのバージョンでもinitializer element is not constant
エラーが出るような作りになっているようにも見える。

c-typeck.c
tree
digest_init (type, init, tail, require_constant, constructor_constant, ofwhat)
     tree type, init, *tail;
     int require_constant, constructor_constant;
     char *ofwhat;
{
// 省略

  /* Any type except an array can be initialized
     from an expression of the same type, optionally with braces.
     For an array, this is allowed only for a string constant.  */

  if (inside_init && TREE_TYPE (inside_init) != 0
      && ((TYPE_MAIN_VARIANT (TREE_TYPE (inside_init))
	   == TYPE_MAIN_VARIANT (type))
	  || (code == ARRAY_TYPE
	      && comptypes (TREE_TYPE (inside_init), type))
	  || (code == POINTER_TYPE
	      && (TREE_CODE (TREE_TYPE (inside_init)) == ARRAY_TYPE
		  || TREE_CODE (TREE_TYPE (inside_init)) == FUNCTION_TYPE)
	      && comptypes (TREE_TYPE (TREE_TYPE (inside_init)),
			    TREE_TYPE (type)))))
    {
// 省略

      if (require_constant && ! TREE_CONSTANT (inside_init))
	{
	  error_init ("initializer element%s is not constant",
		      " for `%s'", ofwhat);
	  inside_init = error_mark_node;
	}
      else if (require_constant
	       && initializer_constant_valid_p (inside_init, TREE_TYPE (inside_init)) == 0)
	{
	  error_init ("initializer element%s is not computable at load time",
		      " for `%s'", ofwhat);
	  inside_init = error_mark_node;
	}

      return inside_init;
    }

Lua Ver2.4 -> Ver2.5

Luaの各バージョンのコードを見るとVer2.5で以下のように変わっていました。

Ver2.4

clients/lib/iolib.c
#include "lua.h"
#include "luadebug.h"
#include "lualib.h"

static FILE *in=stdin, *out=stdout;

Ver2.5

clients/lib/iolib.c
#include "lua.h"
#include "luadebug.h"
#include "lualib.h"

FILE *lua_infile, *lua_outfile;
//省略
void iolib_open (void)
{
  lua_infile=stdin; lua_outfile=stdout;
  luaI_openlib(iolib, (sizeof(iolib)/sizeof(iolib[0])));
  lua_setfallback("error", errorfb);
}

HISTORYファイルを見ると以下の記載がありました。

HISTORY
Current version is 2.5

* Changes since version 2.4
  + io and string libraries are now based on pattern matching;
    the old libraries are still available for compatibility
  + dofile and dostring can now return values (via return statement)
  + better support for 16- and 64-bit machines
  + expanded documentation, with more examples

まとめ

initializer element is not constantのエラーが昔の環境では出なかったのかどうかは
わかりませんでした。

https://godbolt.org/ というサイトがあることが知れてよかった。

Lua Ver2.5で initializer element is not constantのエラーは最新のgccを使っても出なくなっているっぽい。

Discussion