Eric Blake <ebb9 <at> byu.net> writes: > Thanks for the report, and hopefully I'll have something soon, once I can > figure out an efficient way to distinguish this without breaking any of the > existing autoconf tests. >
I believe this does it; I'm now running it through my tests before pushing, but you can test it: git pull git://repo.or.cz/autoconf/ericb.git mob From: Eric Blake <[email protected]> Date: Wed, 28 Jan 2009 11:01:42 -0700 Subject: [PATCH] Silence another false positive expand-before-require. * lib/m4sugar/m4sugar.m4 (_m4_defun_pro_outer) (_m4_defun_epi_outer, _m4_require_call, m4_provide): Track name that caused a diversion change, not just diversion number. (m4_require): Factor... (_m4_require_check): ...into new macro, which also checks whether diversion that performed the expansion has been collected. * tests/m4sugar.at (m4@&t...@_require: nested): Enhance test. Reported by Ralf Wildenhues. Signed-off-by: Eric Blake <[email protected]> --- ChangeLog | 12 ++++++++++++ lib/m4sugar/m4sugar.m4 | 35 +++++++++++++++++++++++++---------- tests/m4sugar.at | 12 ++++++++++++ 3 files changed, 49 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 44e147c..e50376e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,17 @@ 2009-01-28 Eric Blake <[email protected]> + Silence another false positive expand-before-require. + * lib/m4sugar/m4sugar.m4 (_m4_defun_pro_outer) + (_m4_defun_epi_outer, _m4_require_call, m4_provide): Track name + that caused a diversion change, not just diversion number. + (m4_require): Factor... + (_m4_require_check): ...into new macro, which also checks whether + diversion that performed the expansion has been collected. + * tests/m4sugar.at (m4@&t...@_require: nested): Enhance test. + Reported by Ralf Wildenhues. + +2009-01-28 Eric Blake <[email protected]> + Fix AC_C_RESTRICT for Sun Studio 12 C++. * lib/autoconf/c.m4 (AC_C_RESTRICT): Newer Sun Studio C provides __restrict__ rather than _Restrict, which still trips up Sun diff --git a/lib/m4sugar/m4sugar.m4 b/lib/m4sugar/m4sugar.m4 index 183c8a6..3ab9aca 100644 --- a/lib/m4sugar/m4sugar.m4 +++ b/lib/m4sugar/m4sugar.m4 @@ -1824,11 +1824,12 @@ m4_define([_m4_divert(GROW)], 10000) # This is called frequently, so minimize the number of macro invocations # by avoiding dnl and m4_defn overhead. m4_define([_m4_defun_pro], -[m4_ifdef([_m4_expansion_stack], [], [_m4_defun_pro_outer[]])]dnl +[m4_ifdef([_m4_expansion_stack], [], [_m4_defun_pro_outer([$1])])]dnl [m4_expansion_stack_push([$1])m4_pushdef([_m4_expanding($1)])]) m4_define([_m4_defun_pro_outer], [m4_set_delete([_m4_provide])]dnl +[m4_pushdef([_m4_diverting([$1])])m4_pushdef([_m4_diverting], [$1])]dnl [m4_pushdef([_m4_divert_dump], m4_divnum)m4_divert_push([GROW])]) # _m4_defun_epi(MACRO-NAME) @@ -1840,11 +1841,12 @@ m4_define([_m4_defun_pro_outer], # by avoiding dnl and m4_popdef overhead. m4_define([_m4_defun_epi], [_m4_popdef([_m4_expanding($1)], [_m4_expansion_stack])]dnl -[m4_ifdef([_m4_expansion_stack], [], [_m4_defun_epi_outer[]])]dnl +[m4_ifdef([_m4_expansion_stack], [], [_m4_defun_epi_outer([$1])])]dnl [m4_provide([$1])]) m4_define([_m4_defun_epi_outer], -[_m4_popdef([_m4_divert_dump])m4_divert_pop([GROW])m4_undivert([GROW])]) +[_m4_popdef([_m4_divert_dump], [_m4_diverting([$1])], [_m4_diverting])]dnl +[m4_divert_pop([GROW])m4_undivert([GROW])]) # _m4_divert_dump @@ -1995,10 +1997,9 @@ m4_define([m4_require], [m4_if(_m4_divert_dump, [], [m4_fatal([$0($1): cannot be used outside of an ]dnl m4_if([$0], [m4_require], [[m4_defun]], [[AC_DEFUN]])['d macro])])]dnl -[m4_provide_if([$1], [m4_set_contains([_m4_provide], [$1], [m4_if(m4_divnum, - _m4_defn([m4_provide($1)]), [m4_ignore], [m4_warn([syntax], - [$0: `$1' was expanded before it was required])_m4_require_call])], - [m4_ignore])], [_m4_require_call])([$1], [$2], _m4_divert_dump)]) +[m4_provide_if([$1], [m4_set_contains([_m4_provide], [$1], + [_m4_require_check([$1], _m4_defn([m4_provide($1)]), [$0])], [m4_ignore])], + [_m4_require_call])([$1], [$2], _m4_divert_dump)]) # _m4_require_call(NAME-TO-CHECK, [BODY-TO-EXPAND = NAME-TO-CHECK], @@ -2011,13 +2012,26 @@ m4_if([$0], [m4_require], [[m4_defun]], [[AC_DEFUN]]) ['d macro])])]dnl # by avoiding dnl and other overhead on the common path. m4_define([_m4_require_call], [m4_pushdef([_m4_divert_grow], m4_decr(_m4_divert_grow))]dnl -[m4_pushdef([_m4_require])]dnl +[m4_pushdef([_m4_diverting([$1])])m4_pushdef([_m4_diverting], [$1])]dnl [m4_divert_push(_m4_divert_grow)]dnl [m4_if([$2], [], [$1], [$2]) m4_provide_if([$1], [m4_set_remove([_m4_provide], [$1])], [m4_warn([syntax], [$1 is m4_require'd but not m4_defun'd])])]dnl [_m4_divert_raw($3)_m4_undivert(_m4_divert_grow)]dnl -[m4_divert_pop(_m4_divert_grow)_m4_popdef([_m4_divert_grow], [_m4_require])]) +[m4_divert_pop(_m4_divert_grow)_m4_popdef([_m4_divert_grow], +[_m4_diverting([$1])], [_m4_diverting])]) + + +# _m4_require_check(NAME-TO-CHECK, OWNER, CALLER) +# ----------------------------------------------- +# NAME-TO-CHECK has been identified as previously expanded in the +# diversion owned by OWNER. If this is a problem, warn on behalf of +# CALLER and return _m4_require_call; otherwise return m4_ignore. +m4_define([_m4_require_check], +[m4_if(_m4_defn([_m4_diverting]), [$2], [m4_ignore], + m4_ifdef([_m4_diverting([$2])], [-]), [-], [m4_warn([syntax], + [$3: `$1' was expanded before it was required])_m4_require_call], + [m4_ignore])]) # _m4_divert_grow @@ -2040,7 +2054,8 @@ m4_define([m4_expand_once], # ---------------------- m4_define([m4_provide], [m4_ifdef([m4_provide($1)], [], -[m4_set_add([_m4_provide], [$1], [m4_define([m4_provide($1)], m4_divnum)])])]) +[m4_set_add([_m4_provide], [$1], [m4_define([m4_provide($1)], + m4_ifdef([_m4_diverting], [_m4_defn([_m4_diverting])]))])])]) # m4_provide_if(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) diff --git a/tests/m4sugar.at b/tests/m4sugar.at index 99d8eab..5f3c01f 100644 --- a/tests/m4sugar.at +++ b/tests/m4sugar.at @@ -618,6 +618,13 @@ e f])dnl m4_defun([h], [[h]m4_require([g])])dnl h +m4_defun([i], [[i]])dnl +m4_defun([j], [[j] +i])dnl +m4_defun([k], [[k]m4_require([i])])dnl +m4_defun([l], [[l]m4_require([k])])dnl +m4_defun([m], [[m]m4_require([j])m4_require([l])])dnl +m ]], [[pre1 a @@ -635,6 +642,11 @@ g e f h +j +i +k +l +m ]]) AT_CLEANUP -- 1.6.0.4
