Fix Savannah bug #106: keep separate track of which variable we are

expanding, and use that info when generating error messages instead of
the file info, where appropriate.
This commit is contained in:
Paul Smith
2006-02-15 23:54:42 +00:00
parent 86af3872a9
commit 0806a403d6
11 changed files with 242 additions and 58 deletions

View File

@@ -1,3 +1,15 @@
2006-02-15 Paul D. Smith <psmith@gnu.org>
* scripts/functions/error: Make sure filename/lineno information
is related to where the error is expanded, not where it's set.
* scripts/functions/warning: Ditto.
* scripts/functions/foreach: Check for different error conditions.
* scripts/functions/word: Ditto.
* scripts/variables/negative: Test some variable reference failure
conditions.
* scripts/options/warn-undefined-variables: Test the
--warn-undefined-variables flag.
2006-02-09 Paul D. Smith <psmith@gnu.org>
* run_make_tests.pl (set_more_defaults): Update valgrind support

View File

@@ -1,3 +1,5 @@
# -*-Perl-*-
$description = "\
The following test creates a makefile to test the error function.";
@@ -5,7 +7,8 @@ $details = "";
open(MAKEFILE,"> $makefile");
print MAKEFILE <<'EOF';
print MAKEFILE 'err = $(error Error found!)
ifdef ERROR1
$(error error is $(ERROR1))
endif
@@ -25,32 +28,39 @@ endif
some: ; @echo Some stuff
EOF
testvar: ; @: $(err)
';
close(MAKEFILE);
# Test #1
&run_make_with_options($makefile, "ERROR1=yes", &get_logfile, 512);
$answer = "$makefile:2: *** error is yes. Stop.\n";
$answer = "$makefile:4: *** error is yes. Stop.\n";
&compare_output($answer,&get_logfile(1));
# Test #2
&run_make_with_options($makefile, "ERROR2=no", &get_logfile, 512);
$answer = "$makefile:6: *** error is no. Stop.\n";
$answer = "$makefile:8: *** error is no. Stop.\n";
&compare_output($answer,&get_logfile(1));
# Test #3
&run_make_with_options($makefile, "ERROR3=maybe", &get_logfile, 512);
$answer = "Some stuff\n$makefile:10: *** error is maybe. Stop.\n";
$answer = "Some stuff\n$makefile:12: *** error is maybe. Stop.\n";
&compare_output($answer,&get_logfile(1));
# Test #4
&run_make_with_options($makefile, "ERROR4=definitely", &get_logfile, 512);
$answer = "Some stuff\n$makefile:14: *** error is definitely. Stop.\n";
$answer = "Some stuff\n$makefile:16: *** error is definitely. Stop.\n";
&compare_output($answer,&get_logfile(1));
# Test #5
&run_make_with_options($makefile, "testvar", &get_logfile, 512);
$answer = "$makefile:22: *** Error found!. Stop.\n";
&compare_output($answer,&get_logfile(1));
# This tells the test driver that the perl test script executed properly.

View File

@@ -57,4 +57,25 @@ $(foreach x,FOREACH,$(eval $(value mktarget)))',
'',
'FOREACH');
# TEST 2: Check some error conditions.
run_make_test('
x = $(foreach )
y = $x
all: ; @echo $y',
'',
"#MAKEFILE#:2: *** insufficient number of arguments (1) to function `foreach'. Stop.",
512);
run_make_test('
x = $(foreach )
y := $x
all: ; @echo $y',
'',
"#MAKEFILE#:2: *** insufficient number of arguments (1) to function `foreach'. Stop.",
512);
1;

View File

@@ -1,3 +1,5 @@
# -*-Perl-*-
$description = "\
The following test creates a makefile to test the warning function.";

View File

@@ -46,11 +46,7 @@ $answer = "6\n"
# Test error conditions
$makefile2 = &get_tmpfile;
open(MAKEFILE, "> $makefile2");
print MAKEFILE <<'EOF';
FOO = foo bar biz baz
run_make_test('FOO = foo bar biz baz
word-e1: ; @echo $(word ,$(FOO))
word-e2: ; @echo $(word abc ,$(FOO))
@@ -58,35 +54,78 @@ word-e3: ; @echo $(word 1a,$(FOO))
wordlist-e1: ; @echo $(wordlist ,,$(FOO))
wordlist-e2: ; @echo $(wordlist abc ,,$(FOO))
wordlist-e3: ; @echo $(wordlist 1, 12a ,$(FOO))
wordlist-e3: ; @echo $(wordlist 1, 12a ,$(FOO))',
'word-e1',
"#MAKEFILE#:3: *** non-numeric first argument to `word' function: ''. Stop.",
512);
EOF
run_make_test(undef,
'word-e2',
"#MAKEFILE#:4: *** non-numeric first argument to `word' function: 'abc '. Stop.",
512);
close(MAKEFILE);
run_make_test(undef,
'word-e3',
"#MAKEFILE#:5: *** non-numeric first argument to `word' function: '1a'. Stop.",
512);
&run_make_with_options($makefile2, 'word-e1', &get_logfile, 512);
$answer = "$makefile2:3: *** non-numeric first argument to `word' function: ''. Stop.\n";
&compare_output($answer, &get_logfile(1));
run_make_test(undef,
'wordlist-e1',
"#MAKEFILE#:7: *** non-numeric first argument to `wordlist' function: ''. Stop.",
512);
&run_make_with_options($makefile2, 'word-e2', &get_logfile, 512);
$answer = "$makefile2:4: *** non-numeric first argument to `word' function: 'abc '. Stop.\n";
&compare_output($answer, &get_logfile(1));
run_make_test(undef,
'wordlist-e2',
"#MAKEFILE#:8: *** non-numeric first argument to `wordlist' function: 'abc '. Stop.",
512);
&run_make_with_options($makefile2, 'word-e3', &get_logfile, 512);
$answer = "$makefile2:5: *** non-numeric first argument to `word' function: '1a'. Stop.\n";
&compare_output($answer, &get_logfile(1));
run_make_test(undef,
'wordlist-e3',
"#MAKEFILE#:9: *** non-numeric second argument to `wordlist' function: ' 12a '. Stop.",
512);
&run_make_with_options($makefile2, 'wordlist-e1', &get_logfile, 512);
$answer = "$makefile2:7: *** non-numeric first argument to `wordlist' function: ''. Stop.\n";
&compare_output($answer, &get_logfile(1));
# Test error conditions again, but this time in a variable reference
&run_make_with_options($makefile2, 'wordlist-e2', &get_logfile, 512);
$answer = "$makefile2:8: *** non-numeric first argument to `wordlist' function: 'abc '. Stop.\n";
&compare_output($answer, &get_logfile(1));
run_make_test('FOO = foo bar biz baz
&run_make_with_options($makefile2, 'wordlist-e3', &get_logfile, 512);
$answer = "$makefile2:9: *** non-numeric second argument to `wordlist' function: ' 12a '. Stop.\n";
&compare_output($answer, &get_logfile(1));
W = $(word $x,$(FOO))
WL = $(wordlist $s,$e,$(FOO))
word-e: ; @echo $(W)
wordlist-e: ; @echo $(WL)',
'word-e x=',
"#MAKEFILE#:3: *** non-numeric first argument to `word' function: ''. Stop.",
512);
run_make_test(undef,
'word-e x=abc',
"#MAKEFILE#:3: *** non-numeric first argument to `word' function: 'abc'. Stop.",
512);
run_make_test(undef,
'word-e x=0',
"#MAKEFILE#:3: *** first argument to `word' function must be greater than 0. Stop.",
512);
run_make_test(undef,
'wordlist-e s= e=',
"#MAKEFILE#:4: *** non-numeric first argument to `wordlist' function: ''. Stop.",
512);
run_make_test(undef,
'wordlist-e s=abc e=',
"#MAKEFILE#:4: *** non-numeric first argument to `wordlist' function: 'abc'. Stop.",
512);
run_make_test(undef,
'wordlist-e s=4 e=12a',
"#MAKEFILE#:4: *** non-numeric second argument to `wordlist' function: '12a'. Stop.",
512);
run_make_test(undef,
'wordlist-e s=0 e=12',
"#MAKEFILE#:4: *** invalid first argument to `wordlist' function: `0'. Stop.",
512);
# TEST #8 -- test $(firstword )

View File

@@ -0,0 +1,25 @@
# -*-perl-*-
$description = "Test the --warn-undefined-variables option.";
$details = "Verify that warnings are printed for referencing undefined variables.";
# Without --warn-undefined-variables, nothing should happen
run_make_test('
EMPTY =
EREF = $(EMPTY)
UREF = $(UNDEFINED)
SEREF := $(EREF)
SUREF := $(UREF)
all: ; @echo ref $(EREF) $(UREF)',
'', 'ref');
# With --warn-undefined-variables, it should warn me
run_make_test(undef, '--warn-undefined-variables',
"#MAKEFILE#:7: warning: undefined variable `UNDEFINED'
#MAKEFILE#:9: warning: undefined variable `UNDEFINED'
ref");
1;

View File

@@ -0,0 +1,46 @@
# -*-perl-*-
$description = "Run some negative tests (things that should fail).";
# TEST #0
# Check that non-terminated variable references are detected (and
# reported using the best filename/lineno info
run_make_test('
foo = bar
x = $(foo
y = $x
all: ; @echo $y
',
'', '#MAKEFILE#:3: *** unterminated variable reference. Stop.',
512);
# TEST #1
# Bogus variable value passed on the command line.
run_make_test(undef,
'x=\$\(other',
'#MAKEFILE#:4: *** unterminated variable reference. Stop.',
512);
# TEST #2
# Again, but this time while reading the makefile.
run_make_test('
foo = bar
x = $(foo
y = $x
z := $y
all: ; @echo $y
',
'', '#MAKEFILE#:3: *** unterminated variable reference. Stop.',
512);
# TEST #3
# Bogus variable value passed on the command line.
run_make_test(undef,
'x=\$\(other',
'#MAKEFILE#:4: *** unterminated variable reference. Stop.',
512);
1;