[flang] Resolve g++ 7.2 build problem
authorpeter klausler <pklausler@nvidia.com>
Mon, 1 Oct 2018 21:36:31 +0000 (14:36 -0700)
committerpeter klausler <pklausler@nvidia.com>
Mon, 1 Oct 2018 21:36:31 +0000 (14:36 -0700)
Original-commit: flang-compiler/f18@09859b2e9c53195c877b89a288ea8aac43cb1804
Reviewed-on: https://github.com/flang-compiler/f18/pull/197

flang/lib/evaluate/expression.cc
flang/lib/evaluate/variable.cc
flang/lib/semantics/semantics.h

index 35f5379..50ac5cb 100644 (file)
@@ -539,8 +539,14 @@ Expr<SomeType>::~Expr() {}
 // Rank()
 template<typename A> int ExpressionBase<A>::Rank() const {
   return std::visit(
-      common::visitors{[](const BOZLiteralConstant &) { return 0; },
-          [](const auto &x) { return x.Rank(); }},
+      [](const auto &x) {
+        if constexpr (std::is_same_v<std::decay_t<decltype(x)>,
+                          BOZLiteralConstant>) {
+          return 0;
+        } else {
+          return x.Rank();
+        }
+      },
       derived().u);
 }
 
index e91aeaa..62d3429 100644 (file)
@@ -420,13 +420,28 @@ int CoarrayRef::Rank() const {
 }
 int DataRef::Rank() const {
   return std::visit(
-      common::visitors{[](const Symbol *sym) { return sym->Rank(); },
-          [](const auto &x) { return x.Rank(); }},
+      // g++ 7.2 emits bogus warnings here and below when common::visitors{}
+      // is used with a "const auto &" catch-all member, so a constexpr type
+      // test has to be used instead.
+      [](const auto &x) {
+        if constexpr (std::is_same_v<std::decay_t<decltype(x)>,
+                          const Symbol *>) {
+          return x->Rank();
+        } else {
+          return x.Rank();
+        }
+      },
       u);
 }
 int Substring::Rank() const {
-  return std::visit(common::visitors{[](const std::string &) { return 0; },
-                        [](const auto &x) { return x.Rank(); }},
+  return std::visit(
+      [](const auto &x) {
+        if constexpr (std::is_same_v<std::decay_t<decltype(x)>, std::string>) {
+          return 0;
+        } else {
+          return x.Rank();
+        }
+      },
       u_);
 }
 int ComplexPart::Rank() const { return complex_.Rank(); }
index 10ec449..1565568 100644 (file)
 
 #include "scope.h"
 #include "../parser/message.h"
+#include <iostream>
 #include <string>
 #include <vector>
-#include <iostream>
 
 namespace Fortran::parser {
-  struct Program;
+struct Program;
 }
 
 namespace Fortran::semantics {