Skip to content

Commit ea50d9d

Browse files
committed
Don't assume string_view::iterator is const char*
There were a few assumptions in the code that these types are equivalent, but they are not on all platforms. The fixes sometimes involve ugly `&*some_iterator` constructs to get to the underlying location. Some of these should be re-considered after switching to c++20. Issues: chipsalliance#2323
1 parent 26188e7 commit ea50d9d

35 files changed

+137
-121
lines changed

.github/workflows/verible-ci.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ jobs:
313313

314314
- name: Install Dependencies
315315
run: |
316-
echo "USE_BAZEL_VERSION=6.5.0" >> $GITHUB_ENV
316+
echo "USE_BAZEL_VERSION=7.4.1" >> $GITHUB_ENV
317317
318318
- name: Checkout code
319319
uses: actions/checkout@v3
@@ -390,7 +390,7 @@ jobs:
390390

391391
- name: Install dependencies
392392
run: |
393-
choco install bazel --force --version=6.5.0
393+
choco install bazel --force --version=7.4.1
394394
choco install winflexbison3
395395
choco install llvm --allow-downgrade --version=17.0.6
396396

MODULE.bazel

+1-7
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,7 @@ bazel_dep(name = "rules_bison", version = "0.3")
1919
# depends on it :( -- to support all active bazel's, we're stuck till EOL bazel6
2020
bazel_dep(name = "googletest", version = "1.14.0.bcr.1", dev_dependency = True)
2121

22-
bazel_dep(name = "abseil-cpp", version = "20240116.2")
23-
single_version_override(
24-
module_name = "abseil-cpp",
25-
patch_strip = 1,
26-
patches = ["//bazel:absl.patch"],
27-
version = "20240116.2",
28-
)
22+
bazel_dep(name = "abseil-cpp", version = "20240722.0.bcr.2")
2923

3024
# Last protobuf version working with windows without strange linking errors.
3125
# This also means that we unfortunately can't use the @protobuf//bazel rules

bazel/absl.patch

-18
This file was deleted.

verible/common/analysis/lint-rule-status.cc

+2-2
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,12 @@ std::string AutoFix::Apply(absl::string_view base) const {
4747
CHECK_GE(base.cend(), edit.fragment.cend());
4848

4949
const absl::string_view text_before(
50-
prev_start, std::distance(prev_start, edit.fragment.cbegin()));
50+
&*prev_start, std::distance(prev_start, edit.fragment.cbegin()));
5151
absl::StrAppend(&result, text_before, edit.replacement);
5252

5353
prev_start = edit.fragment.cend();
5454
}
55-
const absl::string_view text_after(prev_start,
55+
const absl::string_view text_after(&*prev_start,
5656
std::distance(prev_start, base.cend()));
5757
return absl::StrCat(result, text_after);
5858
}

verible/common/formatting/BUILD

+1
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ cc_library(
153153
"//verible/common/util:vector-tree",
154154
"@abseil-cpp//absl/container:fixed_array",
155155
"@abseil-cpp//absl/log",
156+
"@abseil-cpp//absl/log:vlog_is_on",
156157
"@abseil-cpp//absl/strings",
157158
"@abseil-cpp//absl/strings:string_view",
158159
],

verible/common/formatting/align_test.cc

+17-13
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ class AlignmentTestFixture : public ::testing::Test,
6969
public UnwrappedLineMemoryHandler {
7070
public:
7171
explicit AlignmentTestFixture(absl::string_view text)
72-
: sample_(text),
72+
: sample_backing_(text),
73+
sample_(sample_backing_),
7374
tokens_(absl::StrSplit(sample_, absl::ByAnyChar(" \n"),
7475
absl::SkipEmpty())) {
7576
for (const auto token : tokens_) {
@@ -80,7 +81,8 @@ class AlignmentTestFixture : public ::testing::Test,
8081
}
8182

8283
protected:
83-
const std::string sample_;
84+
const std::string sample_backing_;
85+
const absl::string_view sample_;
8486
const std::vector<absl::string_view> tokens_;
8587
std::vector<TokenInfo> ftokens_;
8688
};
@@ -271,7 +273,7 @@ TEST_F(Sparse3x3MatrixAlignmentTest, AlignmentPolicyFlushLeft) {
271273

272274
TEST_F(Sparse3x3MatrixAlignmentTest, AlignmentPolicyPreserve) {
273275
// Set previous-token string pointers to preserve spaces.
274-
ConnectPreFormatTokensPreservedSpaceStarts(sample_.data(),
276+
ConnectPreFormatTokensPreservedSpaceStarts(sample_.begin(),
275277
&pre_format_tokens_);
276278

277279
TabularAlignTokens(40, sample_, ByteOffsetSet(), kPreserveAlignmentHandler,
@@ -391,7 +393,7 @@ TEST_F(Sparse3x3MatrixAlignmentTest, IgnoreCommentLine) {
391393

392394
TEST_F(Sparse3x3MatrixAlignmentTest, CompletelyDisabledNoAlignment) {
393395
// Disabled ranges use original spacing
394-
ConnectPreFormatTokensPreservedSpaceStarts(sample_.data(),
396+
ConnectPreFormatTokensPreservedSpaceStarts(sample_.begin(),
395397
&pre_format_tokens_);
396398

397399
// Require 1 space between tokens.
@@ -413,7 +415,7 @@ TEST_F(Sparse3x3MatrixAlignmentTest, CompletelyDisabledNoAlignment) {
413415

414416
TEST_F(Sparse3x3MatrixAlignmentTest, CompletelyDisabledNoAlignmentWithIndent) {
415417
// Disabled ranges use original spacing
416-
ConnectPreFormatTokensPreservedSpaceStarts(sample_.data(),
418+
ConnectPreFormatTokensPreservedSpaceStarts(sample_.begin(),
417419
&pre_format_tokens_);
418420

419421
// Require 1 space between tokens.
@@ -445,7 +447,7 @@ class Sparse3x3MatrixAlignmentMoreSpacesTest
445447
Sparse3x3MatrixAlignmentMoreSpacesTest()
446448
: Sparse3x3MatrixAlignmentTest("one two\nthree four\nfive six") {
447449
// This is needed for preservation of original spacing.
448-
ConnectPreFormatTokensPreservedSpaceStarts(sample_.data(),
450+
ConnectPreFormatTokensPreservedSpaceStarts(sample_.begin(),
449451
&pre_format_tokens_);
450452
}
451453
};
@@ -480,7 +482,7 @@ TEST_F(Sparse3x3MatrixAlignmentMoreSpacesTest,
480482

481483
TEST_F(Sparse3x3MatrixAlignmentTest, PartiallyDisabledNoAlignment) {
482484
// Disabled ranges use original spacing
483-
ConnectPreFormatTokensPreservedSpaceStarts(sample_.data(),
485+
ConnectPreFormatTokensPreservedSpaceStarts(sample_.begin(),
484486
&pre_format_tokens_);
485487

486488
// Require 1 space between tokens.
@@ -865,7 +867,7 @@ class Dense2x2MatrixAlignmentTest : public MatrixTreeAlignmentTestFixture {
865867
CHECK_EQ(tokens_.size(), 4);
866868

867869
// Need to know original spacing to be able to infer user-intent.
868-
ConnectPreFormatTokensPreservedSpaceStarts(sample_.data(),
870+
ConnectPreFormatTokensPreservedSpaceStarts(sample_.begin(),
869871
&pre_format_tokens_);
870872

871873
// Require 1 space between tokens.
@@ -1170,7 +1172,7 @@ TEST_F(SubcolumnsTreeAlignmentTest, AlignmentPolicyFlushLeft) {
11701172
}
11711173

11721174
TEST_F(SubcolumnsTreeAlignmentTest, AlignmentPolicyPreserve) {
1173-
ConnectPreFormatTokensPreservedSpaceStarts(sample_.data(),
1175+
ConnectPreFormatTokensPreservedSpaceStarts(sample_.begin(),
11741176
&pre_format_tokens_);
11751177

11761178
TabularAlignTokens(40, sample_, ByteOffsetSet(),
@@ -1332,7 +1334,7 @@ class InferSubcolumnsTreeAlignmentTest : public SubcolumnsTreeAlignmentTest {
13321334
"( eleven nineteen-ninety-nine 2k )\n")
13331335
: SubcolumnsTreeAlignmentTest(text) {
13341336
// Need to know original spacing to be able to infer user-intent.
1335-
ConnectPreFormatTokensPreservedSpaceStarts(sample_.data(),
1337+
ConnectPreFormatTokensPreservedSpaceStarts(sample_.begin(),
13361338
&pre_format_tokens_);
13371339

13381340
// Require 1 space between tokens.
@@ -1497,15 +1499,16 @@ class FormatUsingOriginalSpacingTest : public ::testing::Test,
14971499
"\n <1NL+7Spaces>\n <1nl+7spaces>"
14981500
"\n\n <2NL+2Spaces>\n\n <2nl+2spaces>"
14991501
"\n \n\n <1NL+1Space+2NL+2Spaces>\n \n\n <1nl+1space+2nl+2spaces>")
1500-
: sample_(text),
1502+
: sample_backing_(text),
1503+
sample_(sample_backing_),
15011504
tokens_(absl::StrSplit(sample_, OutsideCharPairs('<', '>'),
15021505
absl::SkipEmpty())) {
15031506
for (const auto token : tokens_) {
15041507
ftokens_.emplace_back(1, token);
15051508
}
15061509
// sample_ is the memory-owning string buffer
15071510
CreateTokenInfosExternalStringBuffer(ftokens_);
1508-
ConnectPreFormatTokensPreservedSpaceStarts(sample_.data(),
1511+
ConnectPreFormatTokensPreservedSpaceStarts(sample_.begin(),
15091512
&pre_format_tokens_);
15101513
}
15111514

@@ -1518,7 +1521,8 @@ class FormatUsingOriginalSpacingTest : public ::testing::Test,
15181521
EXPECT_PRED_FORMAT2(TokenPartitionTreesEqualPredFormat, nodes[0], expected);
15191522
}
15201523

1521-
const std::string sample_;
1524+
const std::string sample_backing_;
1525+
const absl::string_view sample_;
15221526
const std::vector<absl::string_view> tokens_;
15231527
std::vector<TokenInfo> ftokens_;
15241528
};

verible/common/formatting/format-token.cc

+12-10
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ std::ostream &operator<<(std::ostream &stream, const InterTokenInfo &t) {
7777
stream << "{\n spaces_required: " << t.spaces_required
7878
<< "\n break_penalty: " << t.break_penalty
7979
<< "\n break_decision: " << t.break_decision
80-
<< "\n preserve_space?: " << (t.preserved_space_start != nullptr)
81-
<< "\n}";
80+
<< "\n preserve_space?: "
81+
<< (t.preserved_space_start != string_view_null_iterator()) << "\n}";
8282
return stream;
8383
}
8484

@@ -143,9 +143,10 @@ InterTokenDecision::InterTokenDecision(const InterTokenInfo &info)
143143
action(ConvertSpacing(info.break_decision)),
144144
preserved_space_start(info.preserved_space_start) {}
145145

146-
static absl::string_view OriginalLeadingSpacesRange(const char *begin,
147-
const char *end) {
148-
if (begin == nullptr) {
146+
static absl::string_view OriginalLeadingSpacesRange(
147+
absl::string_view::const_iterator begin,
148+
absl::string_view::const_iterator end) {
149+
if (begin == string_view_null_iterator()) {
149150
VLOG(4) << "no original space range";
150151
return make_string_view_range(end, end); // empty range
151152
}
@@ -163,7 +164,7 @@ absl::string_view FormattedToken::OriginalLeadingSpaces() const {
163164
std::ostream &FormattedToken::FormattedText(std::ostream &stream) const {
164165
switch (before.action) {
165166
case SpacingDecision::kPreserve: {
166-
if (before.preserved_space_start != nullptr) {
167+
if (before.preserved_space_start != string_view_null_iterator()) {
167168
// Calculate string_view range of pre-existing spaces, and print that.
168169
stream << OriginalLeadingSpaces();
169170
} else {
@@ -196,15 +197,15 @@ absl::string_view PreFormatToken::OriginalLeadingSpaces() const {
196197

197198
size_t PreFormatToken::LeadingSpacesLength() const {
198199
if (before.break_decision == SpacingOptions::kPreserve &&
199-
before.preserved_space_start != nullptr) {
200+
before.preserved_space_start != string_view_null_iterator()) {
200201
return OriginalLeadingSpaces().length();
201202
}
202203
// in other cases (append, wrap), take the spaces_required value.
203204
return before.spaces_required;
204205
}
205206

206207
int PreFormatToken::ExcessSpaces() const {
207-
if (before.preserved_space_start == nullptr) return 0;
208+
if (before.preserved_space_start == string_view_null_iterator()) return 0;
208209
const absl::string_view leading_spaces = OriginalLeadingSpaces();
209210
int delta = 0;
210211
if (!absl::StrContains(leading_spaces, "\n")) {
@@ -228,9 +229,10 @@ std::ostream &operator<<(std::ostream &stream, const PreFormatToken &t) {
228229
}
229230

230231
void ConnectPreFormatTokensPreservedSpaceStarts(
231-
const char *buffer_start, std::vector<PreFormatToken> *format_tokens) {
232+
absl::string_view::const_iterator buffer_start,
233+
std::vector<PreFormatToken> *format_tokens) {
232234
VLOG(4) << __FUNCTION__;
233-
CHECK(buffer_start != nullptr);
235+
CHECK(buffer_start != string_view_null_iterator());
234236
for (auto &ftoken : *format_tokens) {
235237
ftoken.before.preserved_space_start = buffer_start;
236238
VLOG(4) << "space: " << VisualizeWhitespace(ftoken.OriginalLeadingSpaces());

verible/common/formatting/format-token.h

+9-3
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@
2828

2929
namespace verible {
3030

31+
// TODO: find something platform independent that is less ugly.
32+
inline absl::string_view::iterator string_view_null_iterator() {
33+
return absl::string_view().begin();
34+
}
3135
// Enumeration for options for formatting spaces between tokens.
3236
// This controls what to explore (if not pre-determined).
3337
// Related enum: SpacingDecision
@@ -76,7 +80,8 @@ struct InterTokenInfo {
7680
// tokens, for the sake of preserving space.
7781
// Together with the current token, they can form a string_view representing
7882
// pre-existing space from the original buffer.
79-
const char *preserved_space_start = nullptr;
83+
absl::string_view::iterator preserved_space_start =
84+
string_view_null_iterator();
8085

8186
InterTokenInfo() = default;
8287
InterTokenInfo(const InterTokenInfo &) = default;
@@ -158,7 +163,7 @@ std::ostream &operator<<(std::ostream &stream, const PreFormatToken &token);
158163
// inter-token (space) text.
159164
// Note that this does not cover the space between the last token and EOF.
160165
void ConnectPreFormatTokensPreservedSpaceStarts(
161-
const char *buffer_start,
166+
absl::string_view::const_iterator buffer_start,
162167
std::vector<verible::PreFormatToken> *format_tokens);
163168

164169
// Marks formatting-disabled ranges of tokens so that their original spacing is
@@ -199,7 +204,8 @@ struct InterTokenDecision {
199204
SpacingDecision action = SpacingDecision::kPreserve;
200205

201206
// When preserving spaces before this token, start from this offset.
202-
const char *preserved_space_start = nullptr;
207+
absl::string_view::iterator preserved_space_start =
208+
string_view_null_iterator();
203209

204210
InterTokenDecision() = default;
205211

verible/common/formatting/format-token_test.cc

+2-2
Original file line numberDiff line numberDiff line change
@@ -218,9 +218,9 @@ class ConnectPreFormatTokensPreservedSpaceStartsTest
218218
public UnwrappedLineMemoryHandler {};
219219

220220
TEST_F(ConnectPreFormatTokensPreservedSpaceStartsTest, Empty) {
221-
const char *text = "";
221+
constexpr absl::string_view text;
222222
CreateTokenInfosExternalStringBuffer({});
223-
ConnectPreFormatTokensPreservedSpaceStarts(text, &pre_format_tokens_);
223+
ConnectPreFormatTokensPreservedSpaceStarts(text.begin(), &pre_format_tokens_);
224224
EXPECT_TRUE(pre_format_tokens_.empty());
225225
}
226226

verible/common/formatting/layout-optimizer.cc

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030

3131
#include "absl/container/fixed_array.h"
3232
#include "absl/log/log.h"
33+
#include "absl/log/vlog_is_on.h"
3334
#include "verible/common/formatting/basic-format-style.h"
3435
#include "verible/common/formatting/layout-optimizer-internal.h"
3536
#include "verible/common/formatting/token-partition-tree.h"

verible/common/formatting/layout-optimizer_test.cc

+7-4
Original file line numberDiff line numberDiff line change
@@ -701,7 +701,8 @@ class LayoutFunctionFactoryTest : public ::testing::Test,
701701
// Setup pointers for OriginalLeadingSpaces()
702702
auto must_wrap_token = must_wrap_pre_format_tokens.begin();
703703
auto joinable_token = joinable_pre_format_tokens.begin();
704-
const char *buffer_start = sample_.data();
704+
absl::string_view sample_view(sample_);
705+
absl::string_view::const_iterator buffer_start = sample_view.begin();
705706
for (size_t i = 0; i < number_of_tokens_in_set; ++i) {
706707
must_wrap_token->before.preserved_space_start = buffer_start;
707708
joinable_token->before.preserved_space_start = buffer_start;
@@ -2387,10 +2388,11 @@ class TokenPartitionsLayoutOptimizerTest : public ::testing::Test,
23872388
public UnwrappedLineMemoryHandler {
23882389
public:
23892390
TokenPartitionsLayoutOptimizerTest()
2390-
: sample_(
2391+
: sample_backing_(
23912392
// : |10 : |20 : |30 : |40
23922393
"one two three four\n"
23932394
"eleven twelve thirteen fourteen\n"),
2395+
sample_(sample_backing_),
23942396
tokens_(
23952397
absl::StrSplit(sample_, absl::ByAnyChar(" \n"), absl::SkipEmpty())),
23962398
style_(CreateStyle()),
@@ -2399,7 +2401,7 @@ class TokenPartitionsLayoutOptimizerTest : public ::testing::Test,
23992401
ftokens_.emplace_back(1, token);
24002402
}
24012403
CreateTokenInfosExternalStringBuffer(ftokens_);
2402-
ConnectPreFormatTokensPreservedSpaceStarts(sample_.data(),
2404+
ConnectPreFormatTokensPreservedSpaceStarts(sample_.begin(),
24032405
&pre_format_tokens_);
24042406

24052407
// Set token properties
@@ -2423,7 +2425,8 @@ class TokenPartitionsLayoutOptimizerTest : public ::testing::Test,
24232425
}
24242426

24252427
protected:
2426-
const std::string sample_;
2428+
const std::string sample_backing_;
2429+
const absl::string_view sample_;
24272430
const std::vector<absl::string_view> tokens_;
24282431
std::vector<TokenInfo> ftokens_;
24292432
const BasicFormatStyle style_;

verible/common/formatting/unwrapped-line-test-utils.h

+4-2
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,10 @@ class UnwrappedLineMemoryHandler {
5656
// Points to the end of joined_token_text_ string buffer.
5757
// Same concept as TextStructureView::EOFToken().
5858
TokenInfo EOFToken() const {
59-
const absl::string_view s(joined_token_text_);
60-
return TokenInfo(verible::TK_EOF, absl::string_view(s.end(), 0));
59+
return TokenInfo(
60+
verible::TK_EOF,
61+
absl::string_view( // NOLINT might be easier with c++20
62+
joined_token_text_.data() + joined_token_text_.length(), 0));
6163
}
6264

6365
protected:

verible/common/strings/range.cc

+4-2
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,12 @@
2323

2424
namespace verible {
2525

26-
absl::string_view make_string_view_range(const char *begin, const char *end) {
26+
absl::string_view make_string_view_range(
27+
absl::string_view::const_iterator begin,
28+
absl::string_view::const_iterator end) {
2729
const int length = std::distance(begin, end);
2830
CHECK_GE(length, 0) << "Malformed string bounds.";
29-
return absl::string_view(begin, length);
31+
return absl::string_view(&*begin, length);
3032
}
3133

3234
std::pair<int, int> SubstringOffsets(absl::string_view substring,

0 commit comments

Comments
 (0)