[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: required-before-expanded warning, next instance
From: |
Eric Blake |
Subject: |
Re: required-before-expanded warning, next instance |
Date: |
Wed, 28 Jan 2009 18:04:43 +0000 (UTC) |
User-agent: |
Loom/3.14 (http://gmane.org/) |
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 <address@hidden>
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@&address@hidden: nested): Enhance test.
Reported by Ralf Wildenhues.
Signed-off-by: Eric Blake <address@hidden>
---
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 <address@hidden>
+ 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@&address@hidden: nested): Enhance test.
+ Reported by Ralf Wildenhues.
+
+2009-01-28 Eric Blake <address@hidden>
+
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