Subject: Re: bug#14830: [PATCH] * configure.ac (HAVE_W32): Avoid nested functions

From: Peter Rosin <[email-masked]>
Date: Tue, 09 Jul 2013 08:53:30 +0200

On 2013-07-09 08:27, Peter Rosin wrote:
> On 2013-07-09 04:41, Eli Zaretskii wrote:
>>> Date: Tue, 09 Jul 2013 00:49:43 +0200
>>> From: Peter Rosin <[email-masked]>
>>>
>>> diff --git a/ChangeLog b/ChangeLog
>>> index 220cffb..03011cf 100644
>>> --- a/ChangeLog
>>> +++ b/ChangeLog
>>> @@ -1,3 +1,8 @@
>>> +2013-07-09  Peter Rosin <[email-masked]>  (tiny change>
>>> +
>>> +	* configure.ac (HAVE_W32): Avoid nested functions (the second
>>> +	argument of AC_LANG_PROGRAM is expanded inside a function).
>>> +
>>>  2013-07-08  Magnus Henoch <[email-masked]> (tiny change)
>>>
>>>  	* configure.ac (HAVE_IMAGEMAGICK): Check on NS also (Bug#14798).
>>> diff --git a/configure.ac b/configure.ac
>>> index 3830ee3..1188f1b 100644
>>> --- a/configure.ac
>>> +++ b/configure.ac
>>> @@ -1632,10 +1632,10 @@ fi
>>>
>>>  if test "${opsys}" = "mingw32"; then
>>>    AC_MSG_CHECKING([whether Windows API headers are recent enough])
>>> -  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
>>> +  AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
>>>       #include <windows.h>
>>> -     #include <usp10.h>]],
>>> -   [[void test(PIMAGE_NT_HEADERS pHeader)
>>> +     #include <usp10.h>
>>> +     void test(PIMAGE_NT_HEADERS pHeader)
>>>       {PIMAGE_SECTION_HEADER pSection = IMAGE_FIRST_SECTION(pHeader);}]])],
>>>     [emacs_cv_w32api=yes
>>>      HAVE_W32=yes],
>>
>> Sorry, I don't follow: what is the problem with the current code?
>>
> 
> AC_LANG_PROGRAM([[
>      #include <windows.h>
>      #include <usp10.h>]],
>    [[void test(PIMAGE_NT_HEADERS pHeader)
>      {PIMAGE_SECTION_HEADER pSection = IMAGE_FIRST_SECTION(pHeader);}]])
> 
> is expanded into the following program (enhanced whitespace):
> 
> #include <windows.h>
> #include <usp10.h>
> 
> int
> main ()
> {
>   void test(PIMAGE_NT_HEADERS pHeader)
>   {
>     PIMAGE_SECTION_HEADER pSection = IMAGE_FIRST_SECTION(pHeader);
>   }
>   ;
>   return 0;
> }
> 
> My fixed version with AC_LANG_SOURCE will not emit the main() function
> and thus avoids nested functions and instead generates this source (again
> with enhanced whitespace):
> 
> #include <windows.h>
> #include <usp10.h>
> 
> void
> test(PIMAGE_NT_HEADERS pHeader)
> {
>   PIMAGE_SECTION_HEADER pSection = IMAGE_FIRST_SECTION(pHeader);
> }
> 
> The background is that when trying to configure with an unsupported
> compiler, MSVC in this case, it errors out with "the Windows API
> headers are too old to support this build", which is a bogus error
> message.
> 
> Agreed, it doesn't really change anything for supported configurations,
> but being able to nest functions has nothing to do with the test at
> hand.

Hmm, the below variant is perhaps clearer?

It expands into:

#include <windows.h>
#include <usp10.h>

int
main ()
{
  PIMAGE_SECTION_HEADER pSection = IMAGE_FIRST_SECTION(pHeader);
  return 0;
}

Cheers,
Peter

diff --git a/ChangeLog b/ChangeLog
index 220cffb..3ba3093 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2013-07-09  Peter Rosin <[email-masked]>  (tiny change>
+
+       * configure.ac (HAVE_W32): Avoid nested functions (the second
+       argument of AC_LANG_PROGRAM is already expanded inside a function).
+
 2013-07-08  Magnus Henoch <[email-masked]> (tiny change)

        * configure.ac (HAVE_IMAGEMAGICK): Check on NS also (Bug#14798).
diff --git a/configure.ac b/configure.ac
index 3830ee3..ddfef68 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1635,8 +1635,7 @@ if test "${opsys}" = "mingw32"; then
   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
      #include <windows.h>
      #include <usp10.h>]],
-   [[void test(PIMAGE_NT_HEADERS pHeader)
-     {PIMAGE_SECTION_HEADER pSection = IMAGE_FIRST_SECTION(pHeader);}]])],
+   [[PIMAGE_SECTION_HEADER pSection = IMAGE_FIRST_SECTION(pHeader)]])],
    [emacs_cv_w32api=yes
     HAVE_W32=yes],
    emacs_cv_w32api=no)
--
1.7.9