diff options
author | Wouter Deconinck <wdconinc@gmail.com> | 2024-01-29 08:18:25 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-29 15:18:25 +0100 |
commit | 97e3da0e3eac78aebcc6ff47d5bc2b897b3deaca (patch) | |
tree | 5f78372a8f4922b9928382132958318235fc7d97 /var | |
parent | d6ff81ab4d22aa333c6bf1ac0fab18b4ada6abc8 (diff) | |
download | spack-97e3da0e3eac78aebcc6ff47d5bc2b897b3deaca.tar.gz spack-97e3da0e3eac78aebcc6ff47d5bc2b897b3deaca.tar.bz2 spack-97e3da0e3eac78aebcc6ff47d5bc2b897b3deaca.tar.xz spack-97e3da0e3eac78aebcc6ff47d5bc2b897b3deaca.zip |
ncurses: fix 5.9 and 6.0 on modern compilers (#41982)
Diffstat (limited to 'var')
-rw-r--r-- | var/spack/repos/builtin/packages/ncurses/0001-Fix-errors-in-type-conversion.patch | 153 | ||||
-rw-r--r-- | var/spack/repos/builtin/packages/ncurses/package.py | 14 |
2 files changed, 166 insertions, 1 deletions
diff --git a/var/spack/repos/builtin/packages/ncurses/0001-Fix-errors-in-type-conversion.patch b/var/spack/repos/builtin/packages/ncurses/0001-Fix-errors-in-type-conversion.patch new file mode 100644 index 0000000000..18ecf3051b --- /dev/null +++ b/var/spack/repos/builtin/packages/ncurses/0001-Fix-errors-in-type-conversion.patch @@ -0,0 +1,153 @@ +From 6e12cb73e23e8e9488c6db1c4710bb4b3d2b48c3 Mon Sep 17 00:00:00 2001 +From: Adam Jiang <jiang.adam@gmail.com> +Date: Fri, 1 Aug 2014 19:58:40 +0900 +Subject: [PATCH 1/2] Fix errors in type conversion + +Basically, converting to 'void*' is not a good idea. However, if that +conversion is unavoidable, it should be done in a proper way. 'const_cast' +itself could not convert type 'T*' to 'void *', this patch adds +'reintepret_cast' to do it correctly. + +At the same time, function that returns on 'const' member like 'void*' should +not be declared as 'const'. +--- + c++/cursesf.h | 12 +++++++----- + c++/cursesm.h | 10 +++++----- + c++/cursesp.h | 9 +++++---- + 3 files changed, 17 insertions(+), 14 deletions(-) + +diff --git a/c++/cursesf.h b/c++/cursesf.h +index 70a30c3..23b3022 100644 +--- a/c++/cursesf.h ++++ b/c++/cursesf.h +@@ -673,7 +673,8 @@ protected: + const T* p_UserData = STATIC_CAST(T*)(0)) + : NCursesForm(nlines,ncols,begin_y,begin_x) { + if (form) +- set_user (const_cast<void *>(p_UserData)); ++ set_user (const_cast<void *>(reinterpret_cast<const void*> ++ (p_UserData))); + } + + public: +@@ -683,7 +684,7 @@ public: + bool autoDelete_Fields=FALSE) + : NCursesForm (Fields, with_frame, autoDelete_Fields) { + if (form) +- set_user (const_cast<void *>(p_UserData)); ++ set_user (const_cast<void *>(reinterpret_cast<const void*>(p_UserData))); + }; + + NCursesUserForm (NCursesFormField Fields[], +@@ -697,19 +698,20 @@ public: + : NCursesForm (Fields, nlines, ncols, begin_y, begin_x, + with_frame, autoDelete_Fields) { + if (form) +- set_user (const_cast<void *>(p_UserData)); ++ set_user (const_cast<void *>(reinterpret_cast<const void*> ++ (p_UserData))); + }; + + virtual ~NCursesUserForm() { + }; + +- inline T* UserData (void) const { ++ inline T* UserData (void) { + return reinterpret_cast<T*>(get_user ()); + }; + + inline virtual void setUserData (const T* p_UserData) { + if (form) +- set_user (const_cast<void *>(p_UserData)); ++ set_user (const_cast<void *>(reinterpret_cast<const void*>(p_UserData))); + } + + }; +diff --git a/c++/cursesm.h b/c++/cursesm.h +index d9c2273..545ed49 100644 +--- a/c++/cursesm.h ++++ b/c++/cursesm.h +@@ -631,7 +631,7 @@ protected: + const T* p_UserData = STATIC_CAST(T*)(0)) + : NCursesMenu(nlines,ncols,begin_y,begin_x) { + if (menu) +- set_user (const_cast<void *>(p_UserData)); ++ set_user (const_cast<void *>(reinterpret_cast<const void*>(p_UserData))); + } + + public: +@@ -641,7 +641,7 @@ public: + bool autoDelete_Items=FALSE) + : NCursesMenu (Items, with_frame, autoDelete_Items) { + if (menu) +- set_user (const_cast<void *>(p_UserData)); ++ set_user (const_cast<void *>(reinterpret_cast<const void*>(p_UserData))); + }; + + NCursesUserMenu (NCursesMenuItem Items[], +@@ -653,19 +653,19 @@ public: + bool with_frame=FALSE) + : NCursesMenu (Items, nlines, ncols, begin_y, begin_x, with_frame) { + if (menu) +- set_user (const_cast<void *>(p_UserData)); ++ set_user (const_cast<void *>(reinterpret_cast<const void*>(p_UserData))); + }; + + virtual ~NCursesUserMenu() { + }; + +- inline T* UserData (void) const { ++ inline T* UserData (void) { + return reinterpret_cast<T*>(get_user ()); + }; + + inline virtual void setUserData (const T* p_UserData) { + if (menu) +- set_user (const_cast<void *>(p_UserData)); ++ set_user (const_cast<void *>(reinterpret_cast<const void*>(p_UserData))); + } + }; + +diff --git a/c++/cursesp.h b/c++/cursesp.h +index 9b63d6d..661e4a9 100644 +--- a/c++/cursesp.h ++++ b/c++/cursesp.h +@@ -236,7 +236,8 @@ public: + : NCursesPanel (nlines, ncols, begin_y, begin_x) + { + if (p) +- set_user (const_cast<void *>(p_UserData)); ++ set_user (const_cast<void *>(reinterpret_cast<const void*> ++ (p_UserData))); + }; + // This creates an user panel of the requested size with associated + // user data pointed to by p_UserData. +@@ -244,14 +245,14 @@ public: + NCursesUserPanel(const T* p_UserData = STATIC_CAST(T*)(0)) : NCursesPanel() + { + if (p) +- set_user(const_cast<void *>(p_UserData)); ++ set_user(const_cast<void *>(reinterpret_cast<const void*>(p_UserData))); + }; + // This creates an user panel associated with the ::stdscr and user data + // pointed to by p_UserData. + + virtual ~NCursesUserPanel() {}; + +- T* UserData (void) const ++ T* UserData (void) + { + return reinterpret_cast<T*>(get_user ()); + }; +@@ -260,7 +261,7 @@ public: + virtual void setUserData (const T* p_UserData) + { + if (p) +- set_user (const_cast<void *>(p_UserData)); ++ set_user (const_cast<void *>(reinterpret_cast<const void*>(p_UserData))); + } + // Associate the user panel with the user data pointed to by p_UserData. + }; +-- +1.8.5.2 (Apple Git-48) + diff --git a/var/spack/repos/builtin/packages/ncurses/package.py b/var/spack/repos/builtin/packages/ncurses/package.py index b7d3ff3d44..50694660b5 100644 --- a/var/spack/repos/builtin/packages/ncurses/package.py +++ b/var/spack/repos/builtin/packages/ncurses/package.py @@ -51,7 +51,9 @@ class Ncurses(AutotoolsPackage, GNUMirrorPackage): depends_on("pkgconfig", type="build") - patch("patch_gcc_5.txt", when="@6.0%gcc@5.0:") + # avoid disallowed const_cast from T* to void* and use reinterpret_cast + # Ref: https://lists.gnu.org/archive/html/bug-ncurses/2014-08/msg00008.html + patch("0001-Fix-errors-in-type-conversion.patch", when="@:5") patch("sed_pgi.patch", when="@:6.0") patch("nvhpc_fix_preprocessor_flag.patch", when="@6.0:6.2%nvhpc") @@ -104,6 +106,16 @@ class Ncurses(AutotoolsPackage, GNUMirrorPackage): elif name == "cxxflags": flags.append(self.compiler.cxx_pic_flag) + # ncurses@:6.0 fails in definition of macro 'mouse_trafo' without -P + if self.spec.satisfies("@:6.0 %gcc@5.0:"): + if name == "cppflags": + flags.append("-P") + + # ncurses@:6.0 uses dynamic exception specifications not allowed in c++17 + if self.spec.satisfies("@:5"): + if name == "cxxflags": + flags.append(self.compiler.cxx14_flag) + return (flags, None, None) def configure(self, spec, prefix): |