diff --git a/src/language.yacc b/src/language.yacc
index ef124c23ba096e67eb6d1a052d182a5b605730af..f9f622ec37f49f5ab0575e8669d8fb6ebf00a0f0 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.209 2000/08/30 21:58:15 grubba Exp $");
+RCSID("$Id: language.yacc,v 1.210 2000/09/05 02:18:12 hubbe Exp $");
 #ifdef HAVE_MEMORY_H
 #include <memory.h>
 #endif
@@ -1518,11 +1518,17 @@ block:'{'
     $<number>1=Pike_compiler->num_used_modules;
     $<number>$=Pike_compiler->compiler_frame->current_number_of_locals;
   } 
+  {
+    /* Trick to store more than one number on compiler stack - Hubbe */
+    $<number>$=Pike_compiler->compiler_frame->last_block_level;
+    Pike_compiler->compiler_frame->last_block_level=$<number>2;
+  }
   statements end_block
   {
     unuse_modules(Pike_compiler->num_used_modules - $<number>1);
     pop_local_variables($<number>2);
-    $$=$3;
+    Pike_compiler->compiler_frame->last_block_level=$<number>3;
+    $$=$4;
   }
   ;
 
@@ -2181,13 +2187,19 @@ cond: TOK_IF
   {
     $<number>$=Pike_compiler->compiler_frame->current_number_of_locals;
   }
+  {
+    /* Trick to store more than one number on compiler stack - Hubbe */
+    $<number>$=Pike_compiler->compiler_frame->last_block_level;
+    Pike_compiler->compiler_frame->last_block_level=$<number>2;
+  }
   '(' safe_comma_expr end_cond statement optional_else_part
   {
-    $$=mknode('?',$4,mknode(':',$6,$7));
+    $$=mknode('?',$5,mknode(':',$7,$8));
     $$->line_number=$1;
     $$=mkcastnode(void_type_string,$$);
     $$->line_number=$1;
     pop_local_variables($<number>2);
+    Pike_compiler->compiler_frame->last_block_level=$<number>3;
   }
   ;
 
@@ -2217,17 +2229,23 @@ foreach: TOK_FOREACH
   {
     $<number>$=Pike_compiler->compiler_frame->current_number_of_locals;
   }
+  {
+    /* Trick to store more than one number on compiler stack - Hubbe */
+    $<number>$=Pike_compiler->compiler_frame->last_block_level;
+    Pike_compiler->compiler_frame->last_block_level=$<number>2;
+  }
   '(' expr0 ',' safe_lvalue end_cond statement
   {
-    if ($6) {
-      $$=mknode(F_FOREACH, mknode(F_VAL_LVAL,$4,$6),$8);
+    if ($7) {
+      $$=mknode(F_FOREACH, mknode(F_VAL_LVAL,$5,$7),$9);
       $$->line_number=$1;
     } else {
       /* Error in lvalue */
-      free_node($4);
-      $$=$8;
+      free_node($5);
+      $$=$9;
     }
     pop_local_variables($<number>2);
+    Pike_compiler->compiler_frame->last_block_level=$<number>3;
   }
   ;
 
@@ -2262,15 +2280,21 @@ for: TOK_FOR
   {
     $<number>$=Pike_compiler->compiler_frame->current_number_of_locals;
   }
+  {
+    /* Trick to store more than one number on compiler stack - Hubbe */
+    $<number>$=Pike_compiler->compiler_frame->last_block_level;
+    Pike_compiler->compiler_frame->last_block_level=$<number>2;
+  }
   '(' unused expected_semicolon for_expr expected_semicolon unused end_cond
   statement
   {
     int i=lex.current_line;
     lex.current_line=$1;
-    $$=mknode(F_COMMA_EXPR, mkcastnode(void_type_string,$4),
-	      mknode(F_FOR,$6,mknode(':',$10,$8)));
+    $$=mknode(F_COMMA_EXPR, mkcastnode(void_type_string,$5),
+	      mknode(F_FOR,$7,mknode(':',$11,$9)));
     lex.current_line=i;
     pop_local_variables($<number>2);
+    Pike_compiler->compiler_frame->last_block_level=$<number>3;
   }
   ;
 
@@ -2279,13 +2303,19 @@ while:  TOK_WHILE
   {
     $<number>$=Pike_compiler->compiler_frame->current_number_of_locals;
   }
+  {
+    /* Trick to store more than one number on compiler stack - Hubbe */
+    $<number>$=Pike_compiler->compiler_frame->last_block_level;
+    Pike_compiler->compiler_frame->last_block_level=$<number>2;
+  }
   '(' safe_comma_expr end_cond statement
   {
     int i=lex.current_line;
     lex.current_line=$1;
-    $$=mknode(F_FOR,$4,mknode(':',$6,NULL));
+    $$=mknode(F_FOR,$5,mknode(':',$7,NULL));
     lex.current_line=i;
     pop_local_variables($<number>2);
+    Pike_compiler->compiler_frame->last_block_level=$<number>3;
   }
   ;
 
@@ -2297,11 +2327,17 @@ switch:	TOK_SWITCH
   {
     $<number>$=Pike_compiler->compiler_frame->current_number_of_locals;
   }
+  {
+    /* Trick to store more than one number on compiler stack - Hubbe */
+    $<number>$=Pike_compiler->compiler_frame->last_block_level;
+    Pike_compiler->compiler_frame->last_block_level=$<number>2;
+  }
   '(' safe_comma_expr end_cond statement
   {
-    $$=mknode(F_SWITCH,$4,$6);
+    $$=mknode(F_SWITCH,$5,$7);
     $$->line_number=$1;
     pop_local_variables($<number>2);
+    Pike_compiler->compiler_frame->last_block_level=$<number>3;
   }
   ;
 
@@ -3279,6 +3315,16 @@ int low_add_local_name(struct compiler_frame *frame,
 			struct pike_string *type,
 			node *def)
 {
+  int tmp=islocal(str);
+  if(tmp >= frame->last_block_level)
+  {
+    if(str->size_shift)
+      my_yyerror("Duplicate local variable, previous declaration on line %d\n",
+		 frame->variable[tmp].line);
+    else
+      my_yyerror("Duplicate local variable '%s', previous declaration on line %d\n",STR0(str),frame->variable[tmp].line);
+  }
+
   debug_malloc_touch(def);
   debug_malloc_touch(type);
   debug_malloc_touch(str);
@@ -3302,6 +3348,11 @@ int low_add_local_name(struct compiler_frame *frame,
     frame->variable[frame->current_number_of_locals].type = type;
     frame->variable[frame->current_number_of_locals].name = str;
     frame->variable[frame->current_number_of_locals].def = def;
+
+    frame->variable[frame->current_number_of_locals].line=lex.current_line;
+    frame->variable[frame->current_number_of_locals].file=lex.current_file;
+    add_ref(lex.current_file);
+
     frame->current_number_of_locals++;
     if(frame->current_number_of_locals > 
        frame->max_number_of_locals)
diff --git a/src/las.h b/src/las.h
index 6e77ba1fad1f792a06bbf8e94de4f52cc64fa008..df07df3990004ed3f1280172b30de94323b3ea6d 100644
--- a/src/las.h
+++ b/src/las.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: las.h,v 1.42 2000/08/30 21:58:16 grubba Exp $
+ * $Id: las.h,v 1.43 2000/09/05 02:18:13 hubbe Exp $
  */
 #ifndef LAS_H
 #define LAS_H
@@ -38,6 +38,8 @@ struct local_variable
   struct pike_string *name;
   struct pike_string *type;
   node *def;
+  struct pike_string *file;
+  int line;
 };
 
 struct compiler_frame
@@ -48,6 +50,7 @@ struct compiler_frame
   struct pike_string *current_return_type;
   int current_number_of_locals;
   int max_number_of_locals;
+  int last_block_level; /* used to detect variables declared in same block */
   int num_args;
   int lexical_scope;
   int current_function_number;
diff --git a/src/program.c b/src/program.c
index d8c28753c9677d8dfe15759f5f64ad0f49695917..10d6bacceccb2a22cd26b01e7b29884d18f2cbbc 100644
--- a/src/program.c
+++ b/src/program.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: program.c,v 1.269 2000/08/31 12:23:34 grubba Exp $");
+RCSID("$Id: program.c,v 1.270 2000/09/05 02:18:13 hubbe Exp $");
 #include "program.h"
 #include "object.h"
 #include "dynamic_buffer.h"
@@ -1740,6 +1740,16 @@ void low_inherit(struct program *p,
   struct inherit inherit;
   struct pike_string *s;
 
+#if 0
+  fprintf(stderr,"LOW_INHERIT(pid=%d, parent=%p, parid=%d, paroff=%d, flags=0x%x, name=%s);\n",
+	  p->id,
+	  parent,
+	  parent_identifier,
+	  parent_offset,
+	  flags,
+	  name?  name->str : "");
+#endif
+	
   if(!p)
   {
     yyerror("Illegal program pointer.");
@@ -3928,8 +3938,11 @@ void push_compiler_frame(int lexical_scope)
   f->lexical_scope=lexical_scope;
   f->current_type=0;
   f->current_return_type=0;
+
   f->current_number_of_locals=0;
   f->max_number_of_locals=0;
+  f->last_block_level=0;
+
   f->current_function_number=-2; /* no function */
   f->recur_label=-1;
   f->is_inline=0;
@@ -3948,6 +3961,8 @@ void pop_local_variables(int level)
     free_string(Pike_compiler->compiler_frame->variable[e].type);
     if(Pike_compiler->compiler_frame->variable[e].def)
       free_node(Pike_compiler->compiler_frame->variable[e].def);
+
+    free_string(Pike_compiler->compiler_frame->variable[e].file);
   }
 }