]> granicus.if.org Git - nethack/commitdiff
g++-12 bits, mostly Qt5 related
authornhmall <nhmall@nethack.org>
Sat, 11 Jun 2022 17:52:58 +0000 (13:52 -0400)
committernhmall <nhmall@nethack.org>
Sat, 11 Jun 2022 17:52:58 +0000 (13:52 -0400)
I forced a test compile to -std=c++20 mostly to see what we would
be up against. There was only a small number of things and they
are corrected in this commit.

c++20 has some issues with comparisons and bit twiddling between
different enums.

The vendor-supplied Qt5 header files triggered some of those issues as
well, so the qt_pre.h and qt_post.h NetHack header files were adjusted
to make those new warnings go away.  I have not tested Qt6 under the
new compiler and c++ version yet.

Because there are multiple pragmas in qt_pre.h now, the conditional
ifdef structure in there was modified a little to make maintenance
simpler and have a single pragma push at the top. The pragma pop
comes after the Qt vendor-supplied header files, and is done
in qt_post.h.

The display.h macro cmap_to_glyph() was used in
a Qt c++ file and triggered a series of warnings because of that.
Rather than write c++20-friendly versions of those macros, the
simple fix is to provide a function on the C side of things
to front the cmap_to_glyph() macro, so fn_cmap_to_glyph()
was added.

Also thrown into this commit, PatR picked up on the fact that for
yesterday's new warning in qt_menu.cpp, the compiler had correctly
picked up on the fact that the format range of the variable 'cash'
had been correctly upper-capped at 999999999L in the warning message
because of an assignment prior. He suggested that perhaps by also adding
    if (cash < 0)
       cash = 0;
the warning might be eliminated altogether.
After a test, that was proven to be correct, so yesterday's
more-kludgy change is reverted and replaced with that variable
variable restriction ahead of the snprintf().

include/extern.h
src/display.c
win/Qt/qt_bind.cpp
win/Qt/qt_inv.cpp
win/Qt/qt_menu.cpp
win/Qt/qt_post.h
win/Qt/qt_pre.h
win/Qt/qt_rip.cpp
win/Qt/qt_stat.cpp
win/Qt/qt_yndlg.cpp

index 9e5e467269c47bfdff05a58aea06d9acf4d94286..160f0829af2fb2f40f9d37665d4a1c4f96a6af48 100644 (file)
@@ -443,6 +443,7 @@ extern void unset_seenv(struct rm *, int, int, int, int);
 extern int warning_of(struct monst *);
 extern void map_glyphinfo(xchar, xchar, int, unsigned, glyph_info *);
 extern void reset_glyphmap(enum glyphmap_change_triggers trigger);
+extern int fn_cmap_to_glyph(int);
 
 /* ### do.c ### */
 
index 4a6e20aa39ec0a91fb4e6aee551f4406b64a865d..da0dd7602b70fc3c0d9b4a458a57bfeb821d5c65 100644 (file)
@@ -3486,4 +3486,16 @@ wall_angle(struct rm *lev)
     return idx;
 }
 
+/*
+ * c++ 20 has problems with some of the display.h macros because
+ * comparisons and bit-fiddling and math between different enums
+ * is deprecated.
+ * Create function versions of some of the macros used in some
+ * NetHack c++ source files (Qt) for use there.
+ */
+int
+fn_cmap_to_glyph(int cmap)
+{
+    return cmap_to_glyph(cmap);
+}
 /*display.c*/
index c27a6b64399fda111565a257dc8f209efcd722d8..b5ee273cbf2ca8c551dc2edf902c589f1a0b08e0 100644 (file)
@@ -139,7 +139,12 @@ NetHackQtBind::qt_Splash()
         if (qt_compact_mode) {
             splash->showMaximized();
         } else {
+#if __cplusplus >= 202002L
+            splash->setFrameStyle(static_cast<int>(QFrame::WinPanel)
+                                     | static_cast<int>(QFrame::Raised));
+#else
             splash->setFrameStyle(QFrame::WinPanel | QFrame::Raised);
+#endif
             splash->setLineWidth(10);
             splash->adjustSize();
             splash->show();
index 53a32ac704fc18357702ccfa7f0ab4eaf198d951..8fec2dfb9d0f59a4003358dac73943cfa3ac63c2 100644 (file)
@@ -137,7 +137,7 @@ void NetHackQtInvUsageWindow::drawWorn(QPainter &painter, obj *nhobj,
         nhUse(alttip);
 #endif
         // an empty slot is shown as floor tile unless it's always empty
-        glyph = canbe ? cmap_to_glyph(S_room) : GLYPH_UNEXPLORED;
+        glyph = canbe ? fn_cmap_to_glyph(S_room) : GLYPH_UNEXPLORED;
     }
     map_glyphinfo(0, 0, glyph, 0, &gi); /* this skirts the defined
                                          * interface unfortunately */
index bc6810b0f0659f2013103b589e80f94c554dca88..d7619c46116f73ef8ff723271009b5fea9764026 100644 (file)
@@ -170,7 +170,12 @@ NetHackQtMenuWindow::NetHackQtMenuWindow(QWidget *parent) :
 
     QGridLayout *grid = new QGridLayout();
     table->setColumnCount(5);
+#if __cplusplus >= 202002L
+    table->setFrameStyle(static_cast<int>(QFrame::Panel)
+                             | static_cast<int>(QFrame::Raised));
+#else
     table->setFrameStyle(QFrame::Panel|QFrame::Sunken);
+#endif
     table->setLineWidth(2); // note: this is not row spacing
     table->setShowGrid(false);
     table->horizontalHeader()->hide();
@@ -1058,7 +1063,7 @@ void NetHackQtTextWindow::UseRIP(int how, time_t when)
 
     char buf[BUFSZ];
     char *dpx;
-    int line, snpres;
+    int line;
 
     /* Put name on stone */
     (void) snprintf(rip_line[NAME_LINE], STONE_LINE_LEN + 1,
@@ -1077,10 +1082,12 @@ void NetHackQtTextWindow::UseRIP(int how, time_t when)
     long cash = std::max(g.done_money, 0L);
     /* force less that 10 digits to satisfy elaborate format checking;
        it's arbitrary but still way, way more than could ever be needed */
+    if (cash < 0)
+        cash = 0;
     if (cash > 999999999L)
         cash = 999999999L;
-    snpres = snprintf(rip_line[GOLD_LINE], STONE_LINE_LEN + 1, "%ld Au", cash);
-    nhUse(snpres);
+    (void) snprintf(rip_line[GOLD_LINE], STONE_LINE_LEN + 1, "%ld Au", cash);
+
     /* Put together death description */
     formatkiller(buf, sizeof buf, how, FALSE);
     //str_copy(buf, killer, SIZE(buf));
index 7cfcdb42ad5e04588564ad45978b87224cdf167c..7c9724473de41df9185fb6fce4b300e9ba3ac663 100644 (file)
@@ -6,10 +6,12 @@
  * #include after <Qt.../Qt...>.
  */
 
+#if defined(__cplusplus)
 #ifdef __clang__
 #pragma clang diagnostic pop
-#elif defined(__GNUC__) && defined(__cplusplus)
+#elif defined(__GNUC__)
 #pragma GCC diagnostic pop
 #endif /* compiler-specific bits */
+#endif /* __cplusplus */
 
 /*qt_post.h*/
index 980196aeb97868b33383441e99a5a39b4c03f6e5..db3830016b8491052fc1dd79149f272ea149bd6d 100644 (file)
 #undef min
 #undef max
 
+#if defined(__cplusplus)
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#endif
+#ifdef __GNUC__
+#pragma GCC diagnostic push
+#endif
+/* the diagnostic pop is in qt_post.h */
+
+#ifdef __clang__
 /* disable warnings for shadowed names; some of the Qt prototypes use
    placeholder argument names which conflict with nethack variables
    ('g', 'u', a couple of others) */
-#ifdef __clang__
-#pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wshadow"
-#elif defined(__GNUC__) && defined(__cplusplus)
-#pragma GCC diagnostic push
+#elif defined(__GNUC__)
 #pragma GCC diagnostic ignored "-Wshadow"
 #endif
 
 #define QFM_WIDTH(foo) horizontalAdvance(foo)
 #endif
 
+#if __cplusplus >= 202002L
+/* c++20 or newer */
+#if QT_VERSION < 0x060000
+/*
+ * qt5/QtWidgets/qsizepolicy.h
+ * Qt5 header file issue under c++ 20
+ *
+ * warning: bitwise operation between different enumeration types 
+ * ‘QSizePolicy::Policy’ and ‘QSizePolicy::PolicyFlag’
+ * is deprecated [-Wdeprecated-enum-enum-conversion]
+ */
+#if defined(__GNUC__)
+#pragma GCC diagnostic ignored "-Wdeprecated-enum-enum-conversion"
+#endif
+#if defined(__clang__)
+#pragma clang diagnostic ignored "-Wdeprecated-enum-enum-conversion"
+#endif
+#endif  /* QT_VERSION < 0x060000 */
+#endif  /* __cplusplus >= 202002L */
+#endif /* __cplusplus */
+
 /*qt_pre.h*/
 
index b4aeb1a3a329533892254a07b34240a8dbc2a135..bcf1056881c11dc4016dd37bad805c2931d52d81 100644 (file)
@@ -79,8 +79,14 @@ void NetHackQtRIP::paintEvent(QPaintEvent* event UNUSED)
        painter.begin(this);
        painter.drawPixmap(pix_x,pix_y,*pixmap);
        for (int i=0; i<riplines; i++) {
-           painter.drawText(rip_text_x-i/2,rip_text_y+i*rip_text_h,
-               1,1,Qt::TextDontClip|Qt::AlignHCenter,line[i]);
+           painter.drawText(rip_text_x-i/2,rip_text_y+i*rip_text_h, 1,1,
+#if __cplusplus >= 202002L
+                static_cast<int>(Qt::TextDontClip)
+                    | static_cast<int>(Qt::AlignHCenter),
+#else
+                Qt::TextDontClip|Qt::AlignHCenter,
+#endif
+               line[i]);
        }
        painter.end();
     }
index 6e33f7752e8a655c5ceb98c4b40e6a9379fa4286..ad56429c1e0627aad7ad5b003fcb11728937042a 100644 (file)
@@ -222,15 +222,31 @@ NetHackQtStatusWindow::NetHackQtStatusWindow() :
     ride.setIcon(p_ride, "riding");
 
     // separator lines
+#if __cplusplus >= 202002L
+    hline1.setFrameStyle(static_cast<int>(QFrame::HLine)
+                             | static_cast<int>(QFrame::Sunken));
+    hline2.setFrameStyle(static_cast<int>(QFrame::HLine)
+                             | static_cast<int>(QFrame::Sunken));
+    hline3.setFrameStyle(static_cast<int>(QFrame::HLine)
+                             | static_cast<int>(QFrame::Sunken));
+#else
     hline1.setFrameStyle(QFrame::HLine | QFrame::Sunken);
     hline2.setFrameStyle(QFrame::HLine | QFrame::Sunken);
     hline3.setFrameStyle(QFrame::HLine | QFrame::Sunken);
+#endif
     hline1.setLineWidth(1);
     hline2.setLineWidth(1);
     hline3.setLineWidth(1);
     // vertical separators for condensed layout (statuslines:2)
+#if __cplusplus >= 202002L
+    vline1.setFrameStyle(static_cast<int>(QFrame::VLine)
+                             | static_cast<int>(QFrame::Sunken));
+    vline2.setFrameStyle(static_cast<int>(QFrame::VLine)
+                             | static_cast<int>(QFrame::Sunken));
+#else
     vline1.setFrameStyle(QFrame::VLine | QFrame::Sunken);
     vline2.setFrameStyle(QFrame::VLine | QFrame::Sunken);
+#endif
     vline1.setLineWidth(1); // separates Alignment from Charisma
     vline2.setLineWidth(1);
     vline2.hide(); // padding to keep row 2 aligned with row 1, never shown
index cd1e7e61d715a73366dde4b28224cbb20f881805..b558b3c537a629f45c28ebc72744ac73b7431a18 100644 (file)
@@ -352,7 +352,12 @@ char NetHackQtYnDialog::Exec()
     } else {
        QLabel label(qlabel,this);
        QPushButton cancel("Dismiss",this);
+#if __cplusplus >= 202002L
+       label.setFrameStyle(static_cast<int>(QFrame::Box)
+                                | static_cast<int>(QFrame::Sunken));
+#else
        label.setFrameStyle(QFrame::Box|QFrame::Sunken);
+#endif
        label.setAlignment(Qt::AlignCenter);
        label.resize(fontMetrics().QFM_WIDTH(qlabel)+60,30+fontMetrics().height());
        cancel.move(width()/2-cancel.width()/2,label.geometry().bottom()+8);