[flang] clean up for push
authorpeter klausler <pklausler@nvidia.com>
Fri, 22 Jun 2018 20:40:56 +0000 (13:40 -0700)
committerpeter klausler <pklausler@nvidia.com>
Fri, 22 Jun 2018 21:59:28 +0000 (14:59 -0700)
Original-commit: flang-compiler/f18@8b5bbcedba41828d24e01251b06789d3eef4ebf8
Reviewed-on: https://github.com/flang-compiler/f18/pull/111
Tree-same-pre-rewrite: false

flang/lib/common/idioms.h
flang/lib/evaluate/CMakeLists.txt
flang/lib/evaluate/common.h
flang/lib/evaluate/expression.h
flang/lib/evaluate/type.cc [deleted file]
flang/lib/evaluate/type.h
flang/lib/parser/basic-parsers.h
flang/lib/parser/parse-tree-visitor.h

index 340cb15..3004c58 100644 (file)
@@ -85,7 +85,7 @@ template<typename... LAMBDAS> visitors(LAMBDAS... x)->visitors<LAMBDAS...>;
 // Invoke CLASS_TRAIT(traitName) to define a trait, then put
 //   using traitName = std::true_type;  (or false_type)
 // into the appropriate class definitions.  You can then use
-//   typename std::enable_if<traitName<...>, ...>::type
+//   typename std::enable_if_t<traitName<...>, ...>
 // in template specialization definitions.
 #define CLASS_TRAIT(T) \
   namespace class_trait_ns_##T { \
@@ -94,14 +94,12 @@ template<typename... LAMBDAS> visitors(LAMBDAS... x)->visitors<LAMBDAS...>;
     template<typename A> \
     constexpr bool has_trait{decltype(test<A>(nullptr))::value}; \
     template<typename A> \
-    constexpr typename std::enable_if<has_trait<A>, bool>::type \
-    trait_value() { \
+    constexpr typename std::enable_if_t<has_trait<A>, bool> trait_value() { \
       using U = typename A::T; \
       return U::value; \
     } \
     template<typename A> \
-    constexpr typename std::enable_if<!has_trait<A>, bool>::type \
-    trait_value() { \
+    constexpr typename std::enable_if_t<!has_trait<A>, bool> trait_value() { \
       return false; \
     } \
   } \
index af481fb..cf43366 100644 (file)
@@ -18,7 +18,6 @@ add_library(FortranEvaluate
   integer.cc
   logical.cc
   real.cc
-  type.cc
 )
 
 target_link_libraries(FortranEvaluate
index 74a4ef4..dc05f46 100644 (file)
 #define FORTRAN_EVALUATE_COMMON_H_
 
 #include "../common/enum-set.h"
+#include "../common/idioms.h"
 #include <cinttypes>
 
 namespace Fortran::evaluate {
 
 // Integers are always ordered; reals may not be.
-enum class Ordering { Less, Equal, Greater };
-enum class Relation { Less, Equal, Greater, Unordered };
+ENUM_CLASS(Ordering, Less, Equal, Greater)
+ENUM_CLASS(Relation, Less, Equal, Greater, Unordered)
 
 static constexpr Ordering CompareUnsigned(std::uint64_t x, std::uint64_t y) {
   if (x < y) {
@@ -64,13 +65,8 @@ static constexpr Relation Reverse(Relation relation) {
   }
 }
 
-enum class RealFlag {
-  Overflow,
-  DivideByZero,
-  InvalidArgument,
-  Underflow,
-  Inexact
-};
+ENUM_CLASS(
+    RealFlag, Overflow, DivideByZero, InvalidArgument, Underflow, Inexact)
 
 using RealFlags = common::EnumSet<RealFlag, 5>;
 
@@ -83,7 +79,7 @@ template<typename A> struct ValueWithRealFlags {
   RealFlags flags;
 };
 
-enum class Rounding { TiesToEven, ToZero, Down, Up, TiesAwayFromZero };
+ENUM_CLASS(Rounding, TiesToEven, ToZero, Down, Up, TiesAwayFromZero)
 
 #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
 constexpr bool IsHostLittleEndian{false};
index 7bcda0f..9af5359 100644 (file)
 #define FORTRAN_EVALUATE_EXPRESSION_H_
 
 // Represent Fortran expressions in a type-safe manner.
-// Expressions are the sole owners of their constituents; there is no
+// Expressions are the sole owners of their constituents; i.e., there is no
 // context-independent hash table or sharing of common subexpressions.
-// Both deep copy and move semantics are supported for expression construction.
+// Both deep copy and move semantics are supported for expression construction
+// and manipulation in place.
 // TODO: variable and function references
+// TODO: elevate some intrinsics to operations
+// TODO: convenience wrappers for constructing conversions
 
 #include "common.h"
 #include "type.h"
@@ -41,7 +44,7 @@ struct AnyCharacterExpr;
 struct AnyIntegerOrRealExpr;
 
 // Helper base classes to manage subexpressions, which are known as data members
-// named 'x' and (for binary operations) 'y'.
+// named 'x' and, for binary operations, 'y'.
 template<typename A> struct Unary {
   Unary(const A &a) : x{std::make_unique<A>(a)} {}
   Unary(std::unique_ptr<const A> &&a) : x{std::move(a)} {}
@@ -488,6 +491,9 @@ struct AnyIntegerOrRealExpr {
 };
 
 // Convenience functions and operator overloadings for expression construction.
+// These definitions are created with temporary helper macros to reduce
+// C++ boilerplate.  All combinations of lvalue and rvalue references are
+// allowed for operands.
 #define UNARY(FUNC, CONSTR) \
   template<typename A> A FUNC(const A &x) { return {typename A::CONSTR{x}}; }
 UNARY(Parentheses, Parentheses)
diff --git a/flang/lib/evaluate/type.cc b/flang/lib/evaluate/type.cc
deleted file mode 100644 (file)
index 3f010ef..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (c) 2018, NVIDIA CORPORATION.  All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "type.h"
-#include <string>
-
-namespace Fortran::evaluate {
-
-std::string CategoryName(Category c) {
-  switch (c) {
-  case Category::Integer: return "Integer";
-  case Category::Real: return "Real";
-  case Category::Complex: return "Complex";
-  case Category::Logical: return "Logical";
-  case Category::Character: return "Character";
-  case Category::Derived: return "Derived";
-  }
-  return "";  // placate g++
-}
-}  // namespace Fortran::evaluate
index bf9edc7..3ef5ee5 100644 (file)
 #include "integer.h"
 #include "logical.h"
 #include "real.h"
+#include "../common/idioms.h"
 #include <string>
 #include <variant>
 
 namespace Fortran::evaluate {
 
-enum class Category { Integer, Real, Complex, Logical, Character, Derived };
-
-std::string CategoryName(Category);
+ENUM_CLASS(Category, Integer, Real, Complex, Logical, Character, Derived)
 
 template<Category C, int KIND> struct TypeBase {
   static constexpr Category category{C};
   static constexpr int kind{KIND};
   static constexpr bool hasLen{false};
   static std::string Dump() {
-    return CategoryName(category) + '(' + std::to_string(kind) + ')';
+    return EnumToString(category) + '(' + std::to_string(kind) + ')';
   }
 };
 
index 3a9a260..822efb1 100644 (file)
@@ -969,18 +969,16 @@ private:
 // With a single argument that is a parser with a usable value of
 // type A, construct<T>(p) invokes T's explicit constructor T(A &&).
 template<class T, typename PA>
-constexpr
-    typename std::enable_if<std::is_same_v<Success, typename PA::resultType>,
-        Construct01<T, PA>>::type
-    construct(const PA &parser) {
+constexpr std::enable_if_t<std::is_same_v<Success, typename PA::resultType>,
+    Construct01<T, PA>>
+construct(const PA &parser) {
   return Construct01<T, PA>{parser};
 }
 
 template<typename T, typename PA>
-constexpr
-    typename std::enable_if<!std::is_same_v<Success, typename PA::resultType>,
-        Construct1<T, PA>>::type
-    construct(const PA &parser) {
+constexpr std::enable_if_t<!std::is_same_v<Success, typename PA::resultType>,
+    Construct1<T, PA>>
+construct(const PA &parser) {
   return Construct1<T, PA>{parser};
 }
 
index 39442f8..c481379 100644 (file)
@@ -35,17 +35,15 @@ namespace Fortran::parser {
 
 // Default case for visitation of non-class data members and strings
 template<typename A, typename V>
-typename std::enable_if<!std::is_class_v<A> ||
-    std::is_same_v<std::string, A>>::type
-Walk(const A &x, V &visitor) {
+std::enable_if_t<!std::is_class_v<A> || std::is_same_v<std::string, A>> Walk(
+    const A &x, V &visitor) {
   if (visitor.Pre(x)) {
     visitor.Post(x);
   }
 }
 template<typename A, typename M>
-typename std::enable_if<!std::is_class_v<A> ||
-    std::is_same_v<std::string, A>>::type
-Walk(A &x, M &mutator) {
+std::enable_if_t<!std::is_class_v<A> || std::is_same_v<std::string, A>> Walk(
+    A &x, M &mutator) {
   if (mutator.Pre(x)) {
     mutator.Post(x);
   }
@@ -142,27 +140,27 @@ void Walk(std::pair<A, B> &x, M &mutator) {
 
 // Trait-determined traversal of empty, tuple, union, and wrapper classes.
 template<typename A, typename V>
-typename std::enable_if<EmptyTrait<A>>::type Walk(const A &x, V &visitor) {
+std::enable_if_t<EmptyTrait<A>> Walk(const A &x, V &visitor) {
   if (visitor.Pre(x)) {
     visitor.Post(x);
   }
 }
 template<typename A, typename M>
-typename std::enable_if<EmptyTrait<A>>::type Walk(A &x, M &mutator) {
+std::enable_if_t<EmptyTrait<A>> Walk(A &x, M &mutator) {
   if (mutator.Pre(x)) {
     mutator.Post(x);
   }
 }
 
 template<typename A, typename V>
-typename std::enable_if<TupleTrait<A>>::type Walk(const A &x, V &visitor) {
+std::enable_if_t<TupleTrait<A>> Walk(const A &x, V &visitor) {
   if (visitor.Pre(x)) {
     Walk(x.t, visitor);
     visitor.Post(x);
   }
 }
 template<typename A, typename M>
-typename std::enable_if<TupleTrait<A>>::type Walk(A &x, M &mutator) {
+std::enable_if_t<TupleTrait<A>> Walk(A &x, M &mutator) {
   if (mutator.Pre(x)) {
     Walk(x.t, mutator);
     mutator.Post(x);
@@ -170,14 +168,14 @@ typename std::enable_if<TupleTrait<A>>::type Walk(A &x, M &mutator) {
 }
 
 template<typename A, typename V>
-typename std::enable_if<UnionTrait<A>>::type Walk(const A &x, V &visitor) {
+std::enable_if_t<UnionTrait<A>> Walk(const A &x, V &visitor) {
   if (visitor.Pre(x)) {
     Walk(x.u, visitor);
     visitor.Post(x);
   }
 }
 template<typename A, typename M>
-typename std::enable_if<UnionTrait<A>>::type Walk(A &x, M &mutator) {
+std::enable_if_t<UnionTrait<A>> Walk(A &x, M &mutator) {
   if (mutator.Pre(x)) {
     Walk(x.u, mutator);
     mutator.Post(x);
@@ -185,14 +183,14 @@ typename std::enable_if<UnionTrait<A>>::type Walk(A &x, M &mutator) {
 }
 
 template<typename A, typename V>
-typename std::enable_if<WrapperTrait<A>>::type Walk(const A &x, V &visitor) {
+std::enable_if_t<WrapperTrait<A>> Walk(const A &x, V &visitor) {
   if (visitor.Pre(x)) {
     Walk(x.v, visitor);
     visitor.Post(x);
   }
 }
 template<typename A, typename M>
-typename std::enable_if<WrapperTrait<A>>::type Walk(A &x, M &mutator) {
+std::enable_if_t<WrapperTrait<A>> Walk(A &x, M &mutator) {
   if (mutator.Pre(x)) {
     Walk(x.v, mutator);
     mutator.Post(x);