[flang] Add test related to issue flang-compiler/f18#267
authorJean Perier <jperier@hsw1.pgi.net>
Thu, 24 Jan 2019 17:49:00 +0000 (09:49 -0800)
committerJean Perier <jperier@hsw1.pgi.net>
Thu, 24 Jan 2019 17:49:00 +0000 (09:49 -0800)
Original-commit: flang-compiler/f18@a9b2a05f7533546d5f791d5558017c45430e1077
Tree-same-pre-rewrite: false

flang/test/evaluate/CMakeLists.txt
flang/test/evaluate/folding.cc [new file with mode: 0644]

index d255e26..3fd9f0d 100644 (file)
@@ -107,6 +107,15 @@ target_link_libraries(ISO-Fortran-binding-test
   FortranRuntime
 )
 
+add_executable(folding-test
+  folding.cc
+)
+
+target_link_libraries(folding-test
+  FortranEvaluateTesting
+  FortranEvaluate
+)
+
 add_test(Expression expression-test)
 add_test(Leadz leading-zero-bit-count-test)
 add_test(PopPar bit-population-count-test)
@@ -116,3 +125,4 @@ add_test(Logical logical-test)
 add_test(Real real-test)
 add_test(RESHAPE reshape-test)
 add_test(ISO-binding ISO-Fortran-binding-test)
+add_test(folding folding-test)
diff --git a/flang/test/evaluate/folding.cc b/flang/test/evaluate/folding.cc
new file mode 100644 (file)
index 0000000..4ec630a
--- /dev/null
@@ -0,0 +1,49 @@
+// Copyright (c) 2018-2019, 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 "testing.h"
+#include "../../lib/evaluate/expression.h"
+#include "../../lib/evaluate/fold.h"
+#include "../../lib/evaluate/type.h"
+#include <tuple>
+
+using namespace Fortran::evaluate;
+
+// helpers to call functions on all types from tuple
+template<typename... T> static void VariadicCallHelper(const T... args) {
+  return;
+}
+
+template<typename Test, typename... T>
+static void VariadicCallHelper(const std::tuple<T...> dummy) {
+  VariadicCallHelper(Test::template Run<T>()...);
+  return;
+}
+
+struct TestGetScalarConstantValue {
+  template<typename T> static bool Run() {
+    Expr<T> exprFullyTyped{Constant<T>{Scalar<T>{}}};
+    Expr<SomeKind<T::category>> exprSomeKind{exprFullyTyped};
+    Expr<SomeType> exprSomeType{exprSomeKind};
+    TEST(GetScalarConstantValue<T>(exprFullyTyped) != nullptr);
+    TEST(GetScalarConstantValue<T>(exprSomeKind) != nullptr);
+    TEST(GetScalarConstantValue<T>(exprSomeType) != nullptr);
+    return true;
+  }
+};
+
+int main() {
+  VariadicCallHelper<TestGetScalarConstantValue>(AllIntrinsicTypes{});
+  return testing::Complete();
+}