diff --git a/src/language.yacc b/src/language.yacc
index cdc60873cc78bc7771506c6d72a7eb03cf5e3c8d..ac77a66778f8b825c6d78136407eec453428716a 100644
--- a/src/language.yacc
+++ b/src/language.yacc
@@ -110,7 +110,7 @@
 /* This is the grammar definition of Pike. */
 
 #include "global.h"
-RCSID("$Id: language.yacc,v 1.203 2000/07/13 06:28:05 hubbe Exp $");
+RCSID("$Id: language.yacc,v 1.204 2000/07/13 22:32:15 grubba Exp $");
 #ifdef HAVE_MEMORY_H
 #include <memory.h>
 #endif
@@ -630,17 +630,68 @@ def: modifiers type_or_error optional_stars TOK_IDENTIFIER push_compiler_frame0
     }
     push_type(T_FUNCTION);
 
-    if ($1 & ID_VARIANT) {
-      /* FIXME: Lookup the type of any existing variant */
-      /* Or the types. */
-    }
-
     {
       struct pike_string *s=compiler_pop_type();
+      int i = isidentifier($4->u.sval.u.string);
+
+      if (Pike_compiler->compiler_pass == 1) {
+	if ($1 & ID_VARIANT) {
+	  /* FIXME: Lookup the type of any existing variant */
+	  /* Or the types. */
+	  fprintf(stderr, "Pass %d: Identifier %s:\n",
+		  Pike_compiler->compiler_pass, $4->u.sval.u.string->str);
+
+	  if (i >= 0) {
+	    struct identifier *id = ID_FROM_INT(Pike_compiler->new_program, i);
+	    if (id) {
+	      struct pike_string *new_type;
+	      fprintf(stderr, "Defined, type:\n");
+	      simple_describe_type(id->type);
+
+	      new_type = or_pike_types(s, id->type, 1);
+	      free_string(s);
+	      s = new_type;
+
+	      fprintf(stderr, "Resulting type:\n");
+	      simple_describe_type(s);
+	    } else {
+	      my_yyerror("Lost identifier %s (%d).",
+			 $4->u.sval.u.string->str, i);
+	    }
+	  } else {
+	    fprintf(stderr, "Not defined.\n");
+	  }
+	  fprintf(stderr, "New type:\n");
+	  simple_describe_type(s);
+	}
+      } else {
+	/* FIXME: Second pass reuses the type from the end of
+	 * the first pass if this is a variant function.
+	 */
+	if (i >= 0) {
+	  if (Pike_compiler->new_program->identifier_references[i].id_flags &
+	      ID_VARIANT) {
+	    struct identifier *id = ID_FROM_INT(Pike_compiler->new_program, i);
+	    fprintf(stderr, "Pass %d: Identifier %s:\n",
+		    Pike_compiler->compiler_pass, $4->u.sval.u.string->str);
+
+	    free_string(s);
+	    copy_shared_string(s, id->type);
+
+	    fprintf(stderr, "Resulting type:\n");
+	    simple_describe_type(s);
+	  }
+	} else {
+	  my_yyerror("Identifier %s lost after first pass.",
+		     $4->u.sval.u.string->str);
+	}
+      }
+
       $<n>$=mkstrnode(s);
       free_string(s);
     }
 
+
 /*    if(Pike_compiler->compiler_pass==1) */
     {
       /* FIXME:
@@ -652,6 +703,11 @@ def: modifiers type_or_error optional_stars TOK_IDENTIFIER push_compiler_frame0
 			$1 & (~ID_EXTERN),
 			IDENTIFIER_PIKE_FUNCTION,
 			0);
+
+      if ($1 & ID_VARIANT) {
+	fprintf(stderr, "Function number: %d\n",
+		Pike_compiler->compiler_frame->current_function_number);
+      }
     }
   }
   block_or_semi
@@ -722,12 +778,21 @@ def: modifiers type_or_error optional_stars TOK_IDENTIFIER push_compiler_frame0
 		  check_node_hash($10),
 		  check_node_hash($<n>9)->u.sval.u.string,
 		  $1);
+
+      if ($1 & ID_VARIANT) {
+	fprintf(stderr, "Function number: %d\n", f);
+      }
+
 #ifdef PIKE_DEBUG
-      if(Pike_interpreter.recoveries && Pike_sp-Pike_interpreter.evaluator_stack < Pike_interpreter.recoveries->stack_pointer)
+      if(Pike_interpreter.recoveries &&
+	 ((Pike_sp - Pike_interpreter.evaluator_stack) <
+	  Pike_interpreter.recoveries->stack_pointer))
 	fatal("Stack error (underflow)\n");
 
-      if(Pike_compiler->compiler_pass == 1 && f!=Pike_compiler->compiler_frame->current_function_number)
-	fatal("define_function screwed up! %d != %d\n",f,Pike_compiler->compiler_frame->current_function_number);
+      if((Pike_compiler->compiler_pass == 1) &&
+	 (f != Pike_compiler->compiler_frame->current_function_number))
+	fatal("define_function screwed up! %d != %d\n",
+	      f, Pike_compiler->compiler_frame->current_function_number);
 #endif
     }
     pop_compiler_frame();