[flang] COMMAND_ARGUMENT_COUNT runtime implementation

Grab whatever ProgramStart has stored in executionEnvironment.argc and
subtract 1 (based on the assumption that ProgramStart is called with
a C-style argc that counts the command name as an argument).

Spoiler alert: The tests will evolve into fixtures when we implement
GET_COMMAND_ARGUMENT etc.

Differential Revision: https://reviews.llvm.org/D109048
This commit is contained in:
Diana Picus 2021-08-25 07:51:48 +00:00
parent 7bb42dc6b1
commit 0c375296cc
4 changed files with 55 additions and 0 deletions

View File

@ -35,6 +35,7 @@ add_flang_library(FortranRuntime
allocatable.cpp
assign.cpp
buffer.cpp
command.cpp
complex-reduction.c
copy.cpp
character.cpp

21
flang/runtime/command.cpp Normal file
View File

@ -0,0 +1,21 @@
//===-- runtime/command.cpp -----------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "command.h"
#include "environment.h"
namespace Fortran::runtime {
CppTypeFor<TypeCategory::Integer, 4> RTNAME(ArgumentCount)() {
int argc{executionEnvironment.argc};
if (argc > 1) {
// C counts the command name as one of the arguments, but Fortran doesn't.
return argc - 1;
}
return 0;
}
} // namespace Fortran::runtime

View File

@ -1,6 +1,7 @@
add_flang_unittest(FlangRuntimeTests
BufferTest.cpp
CharacterTest.cpp
CommandTest.cpp
CrashHandlerFixture.cpp
ExternalIOTest.cpp
Format.cpp

View File

@ -0,0 +1,32 @@
//===-- flang/unittests/RuntimeGTest/CommandTest.cpp ----------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "../../runtime/command.h"
#include "gtest/gtest.h"
#include "../../runtime/descriptor.h"
#include "../../runtime/main.h"
using namespace Fortran::runtime;
TEST(ArgumentCount, ZeroArguments) {
const char *argv[]{"aProgram"};
RTNAME(ProgramStart)(1, argv, {});
EXPECT_EQ(0, RTNAME(ArgumentCount)());
}
TEST(ArgumentCount, OneArgument) {
const char *argv[]{"aProgram", "anArgument"};
RTNAME(ProgramStart)(2, argv, {});
EXPECT_EQ(1, RTNAME(ArgumentCount)());
}
TEST(ArgumentCount, SeveralArguments) {
const char *argv[]{"aProgram", "arg1", "arg2", "arg3", "arg4"};
RTNAME(ProgramStart)(5, argv, {});
EXPECT_EQ(4, RTNAME(ArgumentCount)());
}