cb424d7448
verify-patch-sanity.py validates every active recipe .patch has internally- consistent hunk line counts — catching the 'malformed patch at line N' failure at commit/CI/preflight time instead of hours into a cook. This cycle hit that class three times (qtwaylandscanner, sddm, xwayland), each only discovered when cookbook tried to apply the patch. Running it across the repo found 29 latent malformed patches (validated against GNU patch: e.g. relibc/P3-sysv-ipc reproduces 'malformed patch at line 22'). They were harmless only because they sit in vendored recipes (baked, not re- applied) — but would fail on any version-bump re-derivation. --fix recounts the hunk headers (body untouched) and repaired all 29. Wired into build-preflight.sh (Phase 1.0D) and redbear-ci.yml, with a unit test (test-patch-sanity.sh). Skips archived/legacy trees and unvalidatable formats (empty placeholders, bare-@@ git hunks).
242 lines
5.8 KiB
C++
242 lines
5.8 KiB
C++
//===-- Semantics/dump-expr.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 "flang/Semantics/dump-expr.h"
|
|
|
|
namespace Fortran::semantics {
|
|
|
|
static constexpr char whiteSpacePadding[]{
|
|
">> "};
|
|
static constexpr auto whiteSize{sizeof(whiteSpacePadding) - 1};
|
|
|
|
inline const char *DumpEvaluateExpr::GetIndentString() const {
|
|
auto count{(level_ * 2 >= whiteSize) ? whiteSize : level_ * 2};
|
|
return whiteSpacePadding + whiteSize - count;
|
|
}
|
|
|
|
void DumpEvaluateExpr::Show(const evaluate::CoarrayRef &x) {
|
|
Indent("coarray ref");
|
|
Show(x.base());
|
|
Show(x.cosubscript());
|
|
Show(x.stat());
|
|
Show(x.team());
|
|
Outdent();
|
|
}
|
|
|
|
void DumpEvaluateExpr::Show(const evaluate::BOZLiteralConstant &) {
|
|
Print("BOZ literal constant");
|
|
}
|
|
|
|
void DumpEvaluateExpr::Show(const evaluate::NullPointer &) {
|
|
Print("null pointer");
|
|
}
|
|
|
|
void DumpEvaluateExpr::Show(const Symbol &symbol) {
|
|
const auto &ultimate{symbol.GetUltimate()};
|
|
Print("symbol: "s + symbol.name().ToString());
|
|
if (const auto *assoc{ultimate.detailsIf<AssocEntityDetails>()}) {
|
|
Indent("assoc details");
|
|
Show(assoc->expr());
|
|
Outdent();
|
|
}
|
|
}
|
|
|
|
void DumpEvaluateExpr::Show(const evaluate::StaticDataObject &) {
|
|
Print("static data object");
|
|
}
|
|
|
|
void DumpEvaluateExpr::Show(const evaluate::ImpliedDoIndex &) {
|
|
Print("implied do index");
|
|
}
|
|
|
|
void DumpEvaluateExpr::Show(const evaluate::BaseObject &x) {
|
|
Indent("base object");
|
|
Show(x.u);
|
|
Outdent();
|
|
}
|
|
void DumpEvaluateExpr::Show(const evaluate::Component &x) {
|
|
Indent("component");
|
|
Show(x.base());
|
|
Show(x.GetLastSymbol());
|
|
Outdent();
|
|
}
|
|
|
|
void DumpEvaluateExpr::Show(const evaluate::NamedEntity &x) {
|
|
Indent("named entity");
|
|
if (const auto *component{x.UnwrapComponent()}) {
|
|
Show(*component);
|
|
} else {
|
|
Show(x.GetFirstSymbol());
|
|
}
|
|
Outdent();
|
|
}
|
|
|
|
void DumpEvaluateExpr::Show(const evaluate::TypeParamInquiry &x) {
|
|
Indent("type inquiry");
|
|
Show(x.base());
|
|
Outdent();
|
|
}
|
|
|
|
void DumpEvaluateExpr::Show(const evaluate::Triplet &x) {
|
|
Indent("triplet");
|
|
Show(x.lower());
|
|
Show(x.upper());
|
|
Show(x.stride());
|
|
Outdent();
|
|
}
|
|
|
|
void DumpEvaluateExpr::Show(const evaluate::Subscript &x) {
|
|
Indent("subscript");
|
|
Show(x.u);
|
|
Outdent();
|
|
}
|
|
|
|
void DumpEvaluateExpr::Show(const evaluate::ArrayRef &x) {
|
|
Indent("array ref");
|
|
Show(x.base());
|
|
Show(x.subscript());
|
|
Outdent();
|
|
}
|
|
|
|
void DumpEvaluateExpr::Show(const evaluate::DataRef &x) {
|
|
Indent("data ref");
|
|
Show(x.u);
|
|
Outdent();
|
|
}
|
|
|
|
void DumpEvaluateExpr::Show(const evaluate::Substring &x) {
|
|
Indent("substring");
|
|
Show(x.parent());
|
|
Show(x.lower());
|
|
Show(x.upper());
|
|
Outdent();
|
|
}
|
|
|
|
void DumpEvaluateExpr::Show(const ParamValue &x) {
|
|
Indent("param value");
|
|
Show(x.GetExplicit());
|
|
Outdent();
|
|
}
|
|
|
|
void DumpEvaluateExpr::Show(
|
|
const DerivedTypeSpec::ParameterMapType::value_type &x) {
|
|
Show(x.second);
|
|
}
|
|
|
|
void DumpEvaluateExpr::Show(const DerivedTypeSpec &x) {
|
|
Indent("derived type spec");
|
|
for (auto &v : x.parameters()) {
|
|
Show(v);
|
|
}
|
|
Outdent();
|
|
}
|
|
|
|
void DumpEvaluateExpr::Show(
|
|
const evaluate::StructureConstructorValues::value_type &x) {
|
|
Show(x.second);
|
|
}
|
|
|
|
void DumpEvaluateExpr::Show(const evaluate::StructureConstructor &x) {
|
|
Indent("structure constructor");
|
|
Show(x.derivedTypeSpec());
|
|
for (auto &v : x) {
|
|
Show(v);
|
|
}
|
|
Outdent();
|
|
}
|
|
|
|
void DumpEvaluateExpr::Show(const evaluate::Relational<evaluate::SomeType> &x) {
|
|
Indent("relational some type");
|
|
Show(x.u);
|
|
Outdent();
|
|
}
|
|
|
|
void DumpEvaluateExpr::Show(const evaluate::ComplexPart &x) {
|
|
Indent("complex part");
|
|
Show(x.complex());
|
|
Outdent();
|
|
}
|
|
|
|
void DumpEvaluateExpr::Show(const evaluate::ActualArgument &x) {
|
|
Indent("actual argument");
|
|
if (const auto *symbol{x.GetAssumedTypeDummy()}) {
|
|
Show(*symbol);
|
|
} else {
|
|
Show(x.UnwrapExpr());
|
|
}
|
|
Outdent();
|
|
}
|
|
|
|
void DumpEvaluateExpr::Show(const evaluate::ProcedureDesignator &x) {
|
|
Indent("procedure designator");
|
|
if (const auto *component{x.GetComponent()}) {
|
|
Show(*component);
|
|
} else if (const auto *symbol{x.GetSymbol()}) {
|
|
Show(*symbol);
|
|
} else {
|
|
Show(DEREF(x.GetSpecificIntrinsic()));
|
|
}
|
|
Outdent();
|
|
}
|
|
|
|
void DumpEvaluateExpr::Show(const evaluate::SpecificIntrinsic &) {
|
|
Print("specific intrinsic");
|
|
}
|
|
|
|
void DumpEvaluateExpr::Show(const evaluate::DescriptorInquiry &x) {
|
|
Indent("descriptor inquiry");
|
|
Show(x.base());
|
|
Outdent();
|
|
}
|
|
|
|
void DumpEvaluateExpr::Print(llvm::Twine twine) {
|
|
outs_ << GetIndentString() << twine << '\n';
|
|
}
|
|
|
|
void DumpEvaluateExpr::Indent(llvm::StringRef s) {
|
|
Print(s + " {");
|
|
level_++;
|
|
}
|
|
|
|
void DumpEvaluateExpr::Outdent() {
|
|
if (level_) {
|
|
level_--;
|
|
}
|
|
Print("}");
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Boilerplate entry points that the debugger can find.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
void DumpEvExpr(const SomeExpr &x) { DumpEvaluateExpr::Dump(x); }
|
|
|
|
void DumpEvExpr(
|
|
const evaluate::Expr<evaluate::Type<common::TypeCategory::Integer, 4>> &x) {
|
|
DumpEvaluateExpr::Dump(x);
|
|
}
|
|
|
|
void DumpEvExpr(
|
|
const evaluate::Expr<evaluate::Type<common::TypeCategory::Integer, 8>> &x) {
|
|
DumpEvaluateExpr::Dump(x);
|
|
}
|
|
|
|
void DumpEvExpr(const evaluate::ArrayRef &x) { DumpEvaluateExpr::Dump(x); }
|
|
|
|
void DumpEvExpr(const evaluate::DataRef &x) { DumpEvaluateExpr::Dump(x); }
|
|
|
|
void DumpEvExpr(const evaluate::Substring &x) { DumpEvaluateExpr::Dump(x); }
|
|
|
|
void DumpEvExpr(
|
|
const evaluate::Designator<evaluate::Type<common::TypeCategory::Integer, 4>>
|
|
&x) {
|
|
DumpEvaluateExpr::Dump(x);
|
|
}
|
|
|
|
} // namespace Fortran::semantics
|