diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4988,6 +4988,8 @@ defm aggressive_function_elimination : BooleanFFlag<"aggressive-function-elimination">, Group; defm align_commons : BooleanFFlag<"align-commons">, Group; defm all_intrinsics : BooleanFFlag<"all-intrinsics">, Group; +defm allow_argument_mismatch : BooleanFFlag<"allow-argument-mismatch">, Group; +defm allow_invalid_boz : BooleanFFlag<"allow-invalid-boz">, Group; def fautomatic : Flag<["-"], "fautomatic">; // -fno-automatic is significant defm backtrace : BooleanFFlag<"backtrace">, Group; defm bounds_check : BooleanFFlag<"bounds-check">, Group; @@ -4995,6 +4997,17 @@ defm cray_pointer : BooleanFFlag<"cray-pointer">, Group; defm d_lines_as_code : BooleanFFlag<"d-lines-as-code">, Group; defm d_lines_as_comments : BooleanFFlag<"d-lines-as-comments">, Group; +defm dec : BooleanFFlag<"dec">, Group; +defm dec_char_conversions : BooleanFFlag<"dec-char-conversions">, Group; +defm dec_structure : BooleanFFlag<"dec-structure">, Group; +defm dec_intrinsic_ints : BooleanFFlag<"dec-intrinsic-ints">, Group; +defm dec_static : BooleanFFlag<"dec-static">, Group; +defm dec_math : BooleanFFlag<"dec-math">, Group; +defm dec_include : BooleanFFlag<"dec-include">, Group; +defm dec_format_defaults : BooleanFFlag<"dec-format-defaults">, Group; +defm dec_blank_format_item : BooleanFFlag<"dec-blank-format-item">, Group; +defm default_real_10 : BooleanFFlag<"default-real-10">, Group; +defm default_real_16 : BooleanFFlag<"default-real-16">, Group; defm dollar_ok : BooleanFFlag<"dollar-ok">, Group; defm dump_fortran_optimized : BooleanFFlag<"dump-fortran-optimized">, Group; defm dump_fortran_original : BooleanFFlag<"dump-fortran-original">, Group; @@ -5002,7 +5015,12 @@ defm external_blas : BooleanFFlag<"external-blas">, Group; defm f2c : BooleanFFlag<"f2c">, Group; defm frontend_optimize : BooleanFFlag<"frontend-optimize">, Group; +defm frontend_loop_interchange : BooleanFFlag<"frontend-loop-interchange">, Group; +defm pad_source : BooleanFFlag<"pad-source">, Group; +defm init_derived : BooleanFFlag<"init-derived">, Group; defm init_local_zero : BooleanFFlag<"init-local-zero">, Group; +defm inline_arg_packing : BooleanFFlag<"inline-arg-packing">, Group; +def finline_matmul_limit : Joined<["-"], "finline-matmul-limit=">, Group; defm integer_4_integer_8 : BooleanFFlag<"integer-4-integer-8">, Group; defm max_identifier_length : BooleanFFlag<"max-identifier-length">, Group; defm module_private : BooleanFFlag<"module-private">, Group; @@ -5020,9 +5038,48 @@ defm repack_arrays : BooleanFFlag<"repack-arrays">, Group; defm second_underscore : BooleanFFlag<"second-underscore">, Group; defm sign_zero : BooleanFFlag<"sign-zero">, Group; +defm test_forall_temp : BooleanFFlag<"test-forall-temp">, Group; +defm tail_call_workaround : BooleanFFlag<"tail-call-workaround">, Group; +def ftail_call_workaround_eq : Joined<["-"], "ftail-call-workaround=">, Group; defm underscoring : BooleanFFlag<"underscoring">, Group; defm whole_file : BooleanFFlag<"whole-file">, Group; +// Gfortran flags that are unsupported by flang +def gfortran_unsupported_Group : OptionGroup< + "">, Flags<[FlangOnlyOption, Ignored]>; + +// gfortran warning flag unsupported in flang +multiclass GfortUnsupportedWarning { + def unsupported_warning_w#NAME : Flag<["-", "--"], "W"#name>, Group; +} + +defm : GfortUnsupportedWarning<"extra">; +defm : GfortUnsupportedWarning<"aliasing">; +defm : GfortUnsupportedWarning<"ampersand">; +defm : GfortUnsupportedWarning<"array-bounds">; +defm : GfortUnsupportedWarning<"c-binding-type">; +defm : GfortUnsupportedWarning<"character-truncation">; +defm : GfortUnsupportedWarning<"conversion">; +defm : GfortUnsupportedWarning<"do-subscript">; +defm : GfortUnsupportedWarning<"function-elimination">; +defm : GfortUnsupportedWarning<"implicit-interface">; +defm : GfortUnsupportedWarning<"implicit-procedure">; +defm : GfortUnsupportedWarning<"intrinsic-shadow">; +defm : GfortUnsupportedWarning<"use-without-only">; +defm : GfortUnsupportedWarning<"intrinsics-std">; +defm : GfortUnsupportedWarning<"line-truncation">; +defm : GfortUnsupportedWarning<"no-align-commons">; +defm : GfortUnsupportedWarning<"no-overwrite-recursive">; +defm : GfortUnsupportedWarning<"no-tabs">; +defm : GfortUnsupportedWarning<"real-q-constant">; +defm : GfortUnsupportedWarning<"surprising">; +defm : GfortUnsupportedWarning<"underflow">; +defm : GfortUnsupportedWarning<"unused-parameter">; +defm : GfortUnsupportedWarning<"realloc-lhs">; +defm : GfortUnsupportedWarning<"realloc-lhs-all">; +defm : GfortUnsupportedWarning<"frontend-loop-interchange">; +defm : GfortUnsupportedWarning<"target-lifetime">; + // C++ SYCL options def fsycl : Flag<["-"], "fsycl">, Flags<[NoXarchOption, CoreOption]>, Group, HelpText<"Enables SYCL kernels compilation for device">; diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -604,14 +604,18 @@ // TODO: Currently throws a Diagnostic for anything other than -W, // this has to change when other -W's are supported. if (args.hasArg(clang::driver::options::OPT_W_Joined)) { - if (args.getLastArgValue(clang::driver::options::OPT_W_Joined) - .equals("error")) { - res.setWarnAsErr(true); - } else { - const unsigned diagID = - diags.getCustomDiagID(clang::DiagnosticsEngine::Error, - "Only `-Werror` is supported currently."); - diags.Report(diagID); + const auto wArgs = + args.getAllArgValues(clang::driver::options::OPT_W_Joined); + for (const auto &wArg : wArgs) { + if (wArg == "error") { + res.setWarnAsErr(true); + } else { + const unsigned diagID = + diags.getCustomDiagID(clang::DiagnosticsEngine::Error, + "Only `-Werror` is supported currently."); + diags.Report(diagID); + break; + } } } diff --git a/flang/test/Driver/werror-all.f90 b/flang/test/Driver/werror-all.f90 new file mode 100644 --- /dev/null +++ b/flang/test/Driver/werror-all.f90 @@ -0,0 +1,13 @@ +! Ensures that -Werror is read regardless of whether or not other -W +! flags are present in the CLI args + +! RUN: not %flang -std=f2018 -Werror -Wextra %s 2>&1 | FileCheck %s --check-prefix=WRONG +! RUN: %flang -std=f2018 -Wextra -Wall %s 2>&1 | FileCheck %s --check-prefix=CHECK-OK + +! WRONG: Semantic errors in +! CHECK-OK: FORALL index variable + +program werror_check_all + integer :: a(3) + forall (j=1:n) a(i) = 1 +end program werror_check_all diff --git a/flang/test/Driver/wextra-ok.f90 b/flang/test/Driver/wextra-ok.f90 new file mode 100644 --- /dev/null +++ b/flang/test/Driver/wextra-ok.f90 @@ -0,0 +1,11 @@ +! Ensure that supplying -Wextra into flang-new does not raise error +! The first check should be changed if -Wextra is implemented + +! RUN: %flang -std=f2018 -Wextra %s 2>&1 | FileCheck %s --check-prefix=CHECK-OK +! RUN: not %flang -std=f2018 -Wblah -Wextra %s 2>&1 | FileCheck %s --check-prefix=WRONG + +! CHECK-OK: argument unused during compilation: '-Wextra' +! WRONG: Only `-Werror` is supported currently. + +program wextra_ok +end program wextra_ok