From f683d443e8cdce5ca6e2394eef037345ade718b1 Mon Sep 17 00:00:00 2001 From: lzy Date: Thu, 7 Nov 2024 20:14:26 +0800 Subject: [PATCH] Add GNU compatibility for first parameter of main must be of type int --- clang/lib/Basic/Diagnostic.cpp | 24 ++++++++++++++----- clang/lib/Frontend/FrontendAction.cpp | 9 +++++++ .../test/Driver/test-error-compatibility.cpp | 7 ++++++ 3 files changed, 34 insertions(+), 6 deletions(-) create mode 100644 clang/test/Driver/test-error-compatibility.cpp diff --git a/clang/lib/Basic/Diagnostic.cpp b/clang/lib/Basic/Diagnostic.cpp index 7a54d27ef9d8..8fcbc717b7f4 100644 --- a/clang/lib/Basic/Diagnostic.cpp +++ b/clang/lib/Basic/Diagnostic.cpp @@ -355,21 +355,33 @@ void DiagnosticsEngine::setSeverity(diag::kind Diag, diag::Severity Map, SourceLocation L) { assert(Diag < diag::DIAG_UPPER_LIMIT && "Can only map builtin diagnostics"); +#ifdef BUILD_FOR_OPENEULER + if (!(DiagOpts->GccCompatible)) { +#endif assert((Diags->isBuiltinWarningOrExtension(Diag) || (Map == diag::Severity::Fatal || Map == diag::Severity::Error)) && "Cannot map errors into warnings!"); +#ifdef BUILD_FOR_OPENEULER + } +#endif assert((L.isInvalid() || SourceMgr) && "No SourceMgr for valid location"); // Don't allow a mapping to a warning override an error/fatal mapping. bool WasUpgradedFromWarning = false; - if (Map == diag::Severity::Warning) { - DiagnosticMapping &Info = GetCurDiagState()->getOrAddMapping(Diag); - if (Info.getSeverity() == diag::Severity::Error || - Info.getSeverity() == diag::Severity::Fatal) { - Map = Info.getSeverity(); - WasUpgradedFromWarning = true; +#ifdef BUILD_FOR_OPENEULER + if (!(DiagOpts->GccCompatible)) { +#endif + if (Map == diag::Severity::Warning) { + DiagnosticMapping &Info = GetCurDiagState()->getOrAddMapping(Diag); + if (Info.getSeverity() == diag::Severity::Error || + Info.getSeverity() == diag::Severity::Fatal) { + Map = Info.getSeverity(); + WasUpgradedFromWarning = true; + } } +#ifdef BUILD_FOR_OPENEULER } +#endif DiagnosticMapping Mapping = makeUserMapping(Map, L); Mapping.setUpgradedFromWarning(WasUpgradedFromWarning); diff --git a/clang/lib/Frontend/FrontendAction.cpp b/clang/lib/Frontend/FrontendAction.cpp index 0bd4b01ff79d..b284b07507c8 100644 --- a/clang/lib/Frontend/FrontendAction.cpp +++ b/clang/lib/Frontend/FrontendAction.cpp @@ -31,6 +31,7 @@ #include "clang/Parse/ParseAST.h" #include "clang/Sema/HLSLExternalSemaSource.h" #include "clang/Sema/MultiplexExternalSemaSource.h" +#include "clang/Sema/SemaDiagnostic.h" #include "clang/Serialization/ASTDeserializationListener.h" #include "clang/Serialization/ASTReader.h" #include "clang/Serialization/GlobalModuleIndex.h" @@ -1170,6 +1171,14 @@ void ASTFrontendAction::ExecuteAction() { if (!CI.hasSema()) CI.createSema(getTranslationUnitKind(), CompletionConsumer); +#ifdef BUILD_FOR_OPENEULER + if (CI.getLangOpts().GccCompatible) { + // error: first parameter of 'main' (argument count) must be of type 'int' + CI.getSema().Diags.setSeverity(diag::err_main_arg_wrong, + diag::Severity::Warning, {}); + } +#endif + ParseAST(CI.getSema(), CI.getFrontendOpts().ShowStats, CI.getFrontendOpts().SkipFunctionBodies); } diff --git a/clang/test/Driver/test-error-compatibility.cpp b/clang/test/Driver/test-error-compatibility.cpp new file mode 100644 index 000000000000..82854173edd4 --- /dev/null +++ b/clang/test/Driver/test-error-compatibility.cpp @@ -0,0 +1,7 @@ +// REQUIRES: build_for_openeuler +// RUN: %clang -fgcc-compatible -c %s 2>&1 | FileCheck -check-prefix=CHECK-error %s +// RUN: not %clang -c %s 2>&1 | FileCheck -check-prefix=CHECK-error %s +// CHECK-error: first parameter of 'main' (argument count) must be of type 'int' +int main(char* argv[]) +{ +} -- Gitee