diff --git a/contrib/unifdef/unifdef.c b/contrib/unifdef/unifdef.c
--- a/contrib/unifdef/unifdef.c
+++ b/contrib/unifdef/unifdef.c
@@ -1550,8 +1550,12 @@
 		sym->value = val;
 		r = RB_INSERT(MACROMAP, &macro_tree, sym);
 		assert(r == NULL);
+		debugsym("addsym", sym);
+	} else {
+		sym->ignore = ignorethis;
+		sym->value = val;
+		debugsym("updsym", sym);
 	}
-	debugsym("addsym", sym);
 }
 
 static void
diff --git a/usr.bin/unifdef/tests/unifdef_test.sh b/usr.bin/unifdef/tests/unifdef_test.sh
--- a/usr.bin/unifdef/tests/unifdef_test.sh
+++ b/usr.bin/unifdef/tests/unifdef_test.sh
@@ -17,6 +17,27 @@
 	atf_check -o file:f unifdef <f
 }
 
+atf_test_case redefine
+redefine_head() {
+	atf_set descr "redefine the same symbol"
+}
+redefine_body() {
+	cat >file <<EOF
+#if FOO
+a
+#else
+b
+#endif
+EOF
+	atf_check -s exit:1 -o inline:"a\n" unifdef -DFOO <file
+	atf_check -s exit:1 -o inline:"a\n" unifdef -UFOO -DFOO <file
+	atf_check -s exit:1 -o inline:"a\n" unifdef -DFOO=0 -DFOO <file
+	atf_check -s exit:1 -o inline:"b\n" unifdef -UFOO <file
+	atf_check -s exit:1 -o inline:"b\n" unifdef -DFOO -UFOO <file
+	atf_check -s exit:1 -o inline:"b\n" unifdef -DFOO -DFOO=0 <file
+}
+
 atf_init_test_cases() {
 	atf_add_test_case hash_comment
+	atf_add_test_case redefine
 }