https://github.com/python/cpython/commit/4abf0d4b3a615944a1f7ece56ccf8576ffc38249
commit: 4abf0d4b3a615944a1f7ece56ccf8576ffc38249
branch: main
author: Serhiy Storchaka <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2026-09-27T19:03:15+03:00
summary:

gh-158078: Fix building curses with narrow ncurses (GH-158088)

Detect curses functions with a link check instead of a compile check,
since the header can declare a function that the library lacks, for
example term_attrs() in the narrow ncurses library.

Fix test_curses on the narrow build.

Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>

files:
M Lib/test/test_curses.py
M configure
M configure.ac

diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py
index 9cc6eee266bdd8..5db44ebedd2ee0 100644
--- a/Lib/test/test_curses.py
+++ b/Lib/test/test_curses.py
@@ -48,6 +48,26 @@ def wrapped(self, *args, **kwargs):
 
 WIDE_BUILD = import_module('_curses')._wide_character_support
 
+def encodable(s, encoding):
+    # Wide characters are only supported in a locale that can encode them.
+    try:
+        s.encode(encoding)
+    except UnicodeEncodeError:
+        return False
+    return True
+
+def storable(s, encoding):
+    # Text the current build can place in character cells.  A wide build
+    # stores any locale-encodable text (combining sequences and multibyte
+    # characters included).  A narrow build has no wide-character cells, so
+    # each character must occupy a single cell -- that is, encode to exactly
+    # one byte.
+    if not encodable(s, encoding):
+        return False
+    if WIDE_BUILD:
+        return True
+    return len(s.encode(encoding)) == len(s)
+
 def requires_wide_build(test):
     @functools.wraps(test)
     def wrapped(self, *args, **kwargs):
@@ -387,24 +407,10 @@ def test_refresh_control(self):
     # combining sequence or a multibyte character are guarded with _storable().
 
     def _encodable(self, s):
-        # Wide characters are only supported in a locale that can encode them.
-        try:
-            s.encode(self.stdscr.encoding)
-        except UnicodeEncodeError:
-            return False
-        return True
+        return encodable(s, self.stdscr.encoding)
 
     def _storable(self, s):
-        # Text the current build can place in character cells.  A wide build
-        # stores any locale-encodable text (combining sequences and multibyte
-        # characters included).  A narrow build has no wide-character cells, so
-        # each character must occupy a single cell -- that is, encode to 
exactly
-        # one byte.
-        if not self._encodable(s):
-            return False
-        if WIDE_BUILD:
-            return True
-        return len(s.encode(self.stdscr.encoding)) == len(s)
+        return storable(s, self.stdscr.encoding)
 
     def _char_code(self, ch):
         # The integer the int-input API (addch(int), do_command()) uses for a
@@ -1124,7 +1130,11 @@ def test_cell_null_char(self):
         # A cell holding a NUL reads back as the cell that writes it.
         win = curses.newwin(3, 8, 0, 0)
         win.insch(0, 0, '\0')
-        self.assertEqual(win.in_wch(0, 0), cell)
+        if WIDE_BUILD:
+            self.assertEqual(win.in_wch(0, 0), cell)
+        else:
+            # A narrow build inserts a NUL as "^@".
+            self.assertEqual(str(win.in_wch(0, 0)), '^')
         # A string of cells cannot hold a NUL: it would end a batch write.
         self.assertRaises(ValueError, curses.complexstr, 'a\0b')
         self.assertRaises(ValueError, curses.complexstr, '\0')
@@ -3593,10 +3603,8 @@ def test_set_and_label(self):
     def test_set_wide(self):
         screen = self.make_slk_screen()
         label = 'Ångström'
-        try:
-            label.encode(screen.stdscr.encoding)
-        except UnicodeEncodeError:
-            self.skipTest('the locale cannot encode %r' % label)
+        if not storable(label, screen.stdscr.encoding):
+            self.skipTest('cannot store %r in this locale' % label)
         curses.slk_set(1, label, 0)
         # The label can be truncated to fit the soft label width, e.g. in the
         # EUC-JP locale, where "Å" and "ö" are double-width JIS X 0212
diff --git a/configure b/configure
index e5d3f0091058ac..8b8bab4ca425db 100755
--- a/configure
+++ b/configure
@@ -31718,21 +31718,22 @@ main (void)
 {
 
         #ifndef is_pad
-        void *x=is_pad
+        void * volatile x = (void *)is_pad; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_is_pad=yes
 else case e in #(
   e) ac_cv_lib_curses_is_pad=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -31778,21 +31779,22 @@ main (void)
 {
 
         #ifndef is_term_resized
-        void *x=is_term_resized
+        void * volatile x = (void *)is_term_resized; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_is_term_resized=yes
 else case e in #(
   e) ac_cv_lib_curses_is_term_resized=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -31838,21 +31840,22 @@ main (void)
 {
 
         #ifndef resize_term
-        void *x=resize_term
+        void * volatile x = (void *)resize_term; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_resize_term=yes
 else case e in #(
   e) ac_cv_lib_curses_resize_term=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -31898,21 +31901,22 @@ main (void)
 {
 
         #ifndef resizeterm
-        void *x=resizeterm
+        void * volatile x = (void *)resizeterm; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_resizeterm=yes
 else case e in #(
   e) ac_cv_lib_curses_resizeterm=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -31958,21 +31962,22 @@ main (void)
 {
 
         #ifndef immedok
-        void *x=immedok
+        void * volatile x = (void *)immedok; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_immedok=yes
 else case e in #(
   e) ac_cv_lib_curses_immedok=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -32018,21 +32023,22 @@ main (void)
 {
 
         #ifndef syncok
-        void *x=syncok
+        void * volatile x = (void *)syncok; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_syncok=yes
 else case e in #(
   e) ac_cv_lib_curses_syncok=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -32078,21 +32084,22 @@ main (void)
 {
 
         #ifndef wchgat
-        void *x=wchgat
+        void * volatile x = (void *)wchgat; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_wchgat=yes
 else case e in #(
   e) ac_cv_lib_curses_wchgat=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -32138,21 +32145,22 @@ main (void)
 {
 
         #ifndef filter
-        void *x=filter
+        void * volatile x = (void *)filter; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_filter=yes
 else case e in #(
   e) ac_cv_lib_curses_filter=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -32198,21 +32206,22 @@ main (void)
 {
 
         #ifndef nofilter
-        void *x=nofilter
+        void * volatile x = (void *)nofilter; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_nofilter=yes
 else case e in #(
   e) ac_cv_lib_curses_nofilter=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -32258,21 +32267,22 @@ main (void)
 {
 
         #ifndef has_key
-        void *x=has_key
+        void * volatile x = (void *)has_key; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_has_key=yes
 else case e in #(
   e) ac_cv_lib_curses_has_key=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -32318,21 +32328,22 @@ main (void)
 {
 
         #ifndef has_mouse
-        void *x=has_mouse
+        void * volatile x = (void *)has_mouse; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_has_mouse=yes
 else case e in #(
   e) ac_cv_lib_curses_has_mouse=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -32378,21 +32389,22 @@ main (void)
 {
 
         #ifndef is_keypad
-        void *x=is_keypad
+        void * volatile x = (void *)is_keypad; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_is_keypad=yes
 else case e in #(
   e) ac_cv_lib_curses_is_keypad=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -32438,21 +32450,22 @@ main (void)
 {
 
         #ifndef is_leaveok
-        void *x=is_leaveok
+        void * volatile x = (void *)is_leaveok; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_is_leaveok=yes
 else case e in #(
   e) ac_cv_lib_curses_is_leaveok=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -32498,21 +32511,22 @@ main (void)
 {
 
         #ifndef typeahead
-        void *x=typeahead
+        void * volatile x = (void *)typeahead; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_typeahead=yes
 else case e in #(
   e) ac_cv_lib_curses_typeahead=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -32558,21 +32572,22 @@ main (void)
 {
 
         #ifndef use_env
-        void *x=use_env
+        void * volatile x = (void *)use_env; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_use_env=yes
 else case e in #(
   e) ac_cv_lib_curses_use_env=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -32618,21 +32633,22 @@ main (void)
 {
 
         #ifndef new_prescr
-        void *x=new_prescr
+        void * volatile x = (void *)new_prescr; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_new_prescr=yes
 else case e in #(
   e) ac_cv_lib_curses_new_prescr=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -32678,21 +32694,22 @@ main (void)
 {
 
         #ifndef use_screen
-        void *x=use_screen
+        void * volatile x = (void *)use_screen; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_use_screen=yes
 else case e in #(
   e) ac_cv_lib_curses_use_screen=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -32738,21 +32755,22 @@ main (void)
 {
 
         #ifndef use_window
-        void *x=use_window
+        void * volatile x = (void *)use_window; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_use_window=yes
 else case e in #(
   e) ac_cv_lib_curses_use_window=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -32798,21 +32816,22 @@ main (void)
 {
 
         #ifndef key_defined
-        void *x=key_defined
+        void * volatile x = (void *)key_defined; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_key_defined=yes
 else case e in #(
   e) ac_cv_lib_curses_key_defined=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -32858,21 +32877,22 @@ main (void)
 {
 
         #ifndef term_attrs
-        void *x=term_attrs
+        void * volatile x = (void *)term_attrs; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_term_attrs=yes
 else case e in #(
   e) ac_cv_lib_curses_term_attrs=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -32918,21 +32938,22 @@ main (void)
 {
 
         #ifndef define_key
-        void *x=define_key
+        void * volatile x = (void *)define_key; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_define_key=yes
 else case e in #(
   e) ac_cv_lib_curses_define_key=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -32978,21 +32999,22 @@ main (void)
 {
 
         #ifndef keyok
-        void *x=keyok
+        void * volatile x = (void *)keyok; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_keyok=yes
 else case e in #(
   e) ac_cv_lib_curses_keyok=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -33038,21 +33060,22 @@ main (void)
 {
 
         #ifndef set_escdelay
-        void *x=set_escdelay
+        void * volatile x = (void *)set_escdelay; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_set_escdelay=yes
 else case e in #(
   e) ac_cv_lib_curses_set_escdelay=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -33098,21 +33121,22 @@ main (void)
 {
 
         #ifndef set_tabsize
-        void *x=set_tabsize
+        void * volatile x = (void *)set_tabsize; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_set_tabsize=yes
 else case e in #(
   e) ac_cv_lib_curses_set_tabsize=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -33158,21 +33182,22 @@ main (void)
 {
 
         #ifndef wattr_get
-        void *x=wattr_get
+        void * volatile x = (void *)wattr_get; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_wattr_get=yes
 else case e in #(
   e) ac_cv_lib_curses_wattr_get=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -33218,21 +33243,22 @@ main (void)
 {
 
         #ifndef wattr_set
-        void *x=wattr_set
+        void * volatile x = (void *)wattr_set; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_wattr_set=yes
 else case e in #(
   e) ac_cv_lib_curses_wattr_set=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -33278,21 +33304,22 @@ main (void)
 {
 
         #ifndef wattr_on
-        void *x=wattr_on
+        void * volatile x = (void *)wattr_on; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_wattr_on=yes
 else case e in #(
   e) ac_cv_lib_curses_wattr_on=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -33338,21 +33365,22 @@ main (void)
 {
 
         #ifndef wattr_off
-        void *x=wattr_off
+        void * volatile x = (void *)wattr_off; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_wattr_off=yes
 else case e in #(
   e) ac_cv_lib_curses_wattr_off=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -33398,21 +33426,22 @@ main (void)
 {
 
         #ifndef wcolor_set
-        void *x=wcolor_set
+        void * volatile x = (void *)wcolor_set; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_wcolor_set=yes
 else case e in #(
   e) ac_cv_lib_curses_wcolor_set=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -33458,21 +33487,22 @@ main (void)
 {
 
         #ifndef slk_attr_on
-        void *x=slk_attr_on
+        void * volatile x = (void *)slk_attr_on; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_slk_attr_on=yes
 else case e in #(
   e) ac_cv_lib_curses_slk_attr_on=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -33518,21 +33548,22 @@ main (void)
 {
 
         #ifndef slk_attr_off
-        void *x=slk_attr_off
+        void * volatile x = (void *)slk_attr_off; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_slk_attr_off=yes
 else case e in #(
   e) ac_cv_lib_curses_slk_attr_off=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -33578,21 +33609,22 @@ main (void)
 {
 
         #ifndef slk_attr_set
-        void *x=slk_attr_set
+        void * volatile x = (void *)slk_attr_set; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_slk_attr_set=yes
 else case e in #(
   e) ac_cv_lib_curses_slk_attr_set=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -33638,21 +33670,22 @@ main (void)
 {
 
         #ifndef slk_color
-        void *x=slk_color
+        void * volatile x = (void *)slk_color; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_slk_color=yes
 else case e in #(
   e) ac_cv_lib_curses_slk_color=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -33866,21 +33899,22 @@ main (void)
 {
 
         #ifndef scr_dump
-        void *x=scr_dump
+        void * volatile x = (void *)scr_dump; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_scr_dump=yes
 else case e in #(
   e) ac_cv_lib_curses_scr_dump=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
@@ -33926,21 +33960,22 @@ main (void)
 {
 
         #ifndef scr_set
-        void *x=scr_set
+        void * volatile x = (void *)scr_set; (void)x;
         #endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_link "$LINENO"
 then :
   ac_cv_lib_curses_scr_set=yes
 else case e in #(
   e) ac_cv_lib_curses_scr_set=no ;;
 esac
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
    ;;
 esac
 fi
diff --git a/configure.ac b/configure.ac
index 82a623fedb8192..40191c05952290 100644
--- a/configure.ac
+++ b/configure.ac
@@ -7426,16 +7426,18 @@ then
 fi
 
 dnl PY_CHECK_CURSES_FUNC(FUNCTION)
+dnl Link, not just compile: a header can declare a function that the library
+dnl lacks, for example term_attrs() in the narrow ncurses library.
 AC_DEFUN([PY_CHECK_CURSES_FUNC],
 [ AS_VAR_PUSHDEF([py_var], [ac_cv_lib_curses_$1])
   AS_VAR_PUSHDEF([py_define], [HAVE_CURSES_]m4_toupper($1))
   AC_CACHE_CHECK(
     [for curses function $1],
     [py_var],
-    [AC_COMPILE_IFELSE(
+    [AC_LINK_IFELSE(
       [AC_LANG_PROGRAM(_CURSES_INCLUDES, [
         #ifndef $1
-        void *x=$1
+        void * volatile x = (void *)$1; (void)x;
         #endif
       ])],
       [AS_VAR_SET([py_var], [yes])],

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to