[SV 46581] Pre-define .LOADED to avoid warnings.

* main.c (main): Pre-define .LOADED as a default-level variable.
* load.c (load_file): Set the value rather than append it.  Avoid
adding an extra initial whitespace.
* tests/scripts/features/load: Run with --warn-undefined-variables.
diff --git a/load.c b/load.c
index 191ebd8..2beab83 100644
--- a/load.c
+++ b/load.c
@@ -168,9 +168,8 @@
   loaded = allocated_variable_expand ("$(.LOADED)");
   fp = strstr (loaded, *ldname);
   r = fp && (fp==loaded || fp[-1]==' ') && (fp[nmlen]=='\0' || fp[nmlen]==' ');
-  free (loaded);
   if (r)
-    return 1;
+    goto exit;
 
   /* If we didn't find a symbol name yet, construct it from the ldname.  */
   if (! symname)
@@ -214,8 +213,21 @@
 
   /* If it succeeded, add the load file to the loaded variable.  */
   if (r > 0)
-    do_variable_definition (flocp, ".LOADED", *ldname, o_default, f_append, 0);
+    {
+      size_t loadlen = strlen (loaded);
+      char *newval = alloca (loadlen + strlen (*ldname) + 2);
+      /* Don't add a space if it's empty.  */
+      if (loadlen)
+        {
+          memcpy (newval, loaded, loadlen);
+          newval[loadlen++] = ' ';
+        }
+      strcpy (&newval[loadlen], *ldname);
+      do_variable_definition (flocp, ".LOADED", newval, o_default, f_simple, 0);
+    }
 
+ exit:
+  free (loaded);
   return r;
 }
 
@@ -237,7 +249,7 @@
 #else
 
 int
-load_file (const gmk_floc *flocp, const char **ldname, int noerror)
+load_file (const gmk_floc *flocp, const char **ldname UNUSED, int noerror)
 {
   if (! noerror)
     O (fatal, flocp,
@@ -247,7 +259,7 @@
 }
 
 void
-unload_file (const char *name)
+unload_file (const char *name UNUSED)
 {
   O (fatal, NILF, "INTERNAL: Cannot unload when load is not supported!");
 }
diff --git a/main.c b/main.c
index f16c6b4..62ed7a8 100644
--- a/main.c
+++ b/main.c
@@ -1316,6 +1316,7 @@
   /* define_variable_cname (".TARGETS", "", o_default, 0)->special = 1; */
   define_variable_cname (".RECIPEPREFIX", "", o_default, 0)->special = 1;
   define_variable_cname (".SHELLFLAGS", "-c", o_default, 0);
+  define_variable_cname (".LOADED", "", o_default, 0);
 
   /* Set up .FEATURES
      Use a separate variable because define_variable_cname() is a macro and
diff --git a/tests/scripts/features/load b/tests/scripts/features/load
index 1f8cdc2..2e9318d 100644
--- a/tests/scripts/features/load
+++ b/tests/scripts/features/load
@@ -56,7 +56,7 @@
 POST := $(.LOADED)
 all: ; @echo pre=$(PRE) post=$(POST) $(TESTLOAD)
 !,
-              '', "pre= post=testload.so implicit\n");
+              '--warn-undefined-variables', "pre= post=testload.so implicit\n");
 
 # TEST 2
 # Load using an explicit function