From 4398c7bd4b0b43c195a60774728558620843414d Mon Sep 17 00:00:00 2001 From: Chris Jefferson Date: Fri, 12 May 2017 11:36:56 +0200 Subject: [PATCH 1/2] Suppress 'Unbound global variable' warning in IsBound --- src/read.c | 1 + tst/testinstall/bound.tst | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/read.c b/src/read.c index 478055bb4a..337c898e83 100644 --- a/src/read.c +++ b/src/read.c @@ -502,6 +502,7 @@ void ReadCallVarAss ( WarnOnUnboundGlobalsRNam = RNamName("WarnOnUnboundGlobals"); if ( type == 'g' + && mode != 'i' && STATE(CountNams) != 0 && var != STATE(CurrLHSGVar) && VAL_GVAR(var) == 0 diff --git a/tst/testinstall/bound.tst b/tst/testinstall/bound.tst index e8d524e4e5..90f5fd03e7 100644 --- a/tst/testinstall/bound.tst +++ b/tst/testinstall/bound.tst @@ -21,4 +21,21 @@ gap> f := ( -> IsBound(r.b) );; f(); true gap> f := ( -> IsBound(r.c) );; f(); false +gap> f := ( -> IsBound(BADVARNAME) );; f(); +false +gap> f := ( -> IsBound(BADVARNAME.BADRECNAME) );; +gap> f(); +Error, Variable: 'BADVARNAME' must have an assigned value +gap> f := ( -> BADVARNAME );; +Syntax warning: Unbound global variable in stream:1 +f := ( -> BADVARNAME );; + ^ +gap> f(); +Error, Variable: 'BADVARNAME' must have an assigned value +gap> f := ( -> IsBound(BADVARNAME[BADLISTNAME]) );; +Syntax warning: Unbound global variable in stream:1 +f := ( -> IsBound(BADVARNAME[BADLISTNAME]) );; + ^ +gap> f(); +Error, Variable: 'BADVARNAME' must have an assigned value gap> STOP_TEST("bound.tst", 1); From 0860db735c176ec7dbfc5c4bdbbd1157cb9569ee Mon Sep 17 00:00:00 2001 From: Chris Jefferson Date: Fri, 12 May 2017 14:10:42 +0200 Subject: [PATCH 2/2] Add some simple documentation to the unbound global variable warning --- src/read.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/read.c b/src/read.c index 337c898e83..d5ba0d9b6c 100644 --- a/src/read.c +++ b/src/read.c @@ -501,17 +501,18 @@ void ReadCallVarAss ( if (WarnOnUnboundGlobalsRNam == 0) WarnOnUnboundGlobalsRNam = RNamName("WarnOnUnboundGlobals"); - if ( type == 'g' - && mode != 'i' - && STATE(CountNams) != 0 - && var != STATE(CurrLHSGVar) - && VAL_GVAR(var) == 0 - && ExprGVar(var) == 0 - && ! STATE(IntrIgnoring) - && ! GlobalComesFromEnclosingForLoop(var) - && (GAPInfo == 0 || !IS_REC(GAPInfo) || !ISB_REC(GAPInfo,WarnOnUnboundGlobalsRNam) || - ELM_REC(GAPInfo,WarnOnUnboundGlobalsRNam) != False ) - && ! SyCompilePlease ) + if ( type == 'g' // Reading a global variable + && mode != 'i' // Not inside 'IsBound' + && STATE(CountNams) != 0 // Inside a function + && var != STATE(CurrLHSGVar) // Not LHS of assignment + && VAL_GVAR(var) == 0 // Not an existing global var + && ExprGVar(var) == 0 // Or an auto var + && ! STATE(IntrIgnoring) // Not currently ignoring parsed code + && ! GlobalComesFromEnclosingForLoop(var) // Not loop variable + && (GAPInfo == 0 || !IS_REC(GAPInfo) + || !ISB_REC(GAPInfo,WarnOnUnboundGlobalsRNam) // Warning enabled + || ELM_REC(GAPInfo,WarnOnUnboundGlobalsRNam) != False ) + && ! SyCompilePlease ) // Not compiling { SyntaxWarning("Unbound global variable"); }