[clang] 28efb1c - [pseudo] Fix an out-of-bound error in LRTable::find.
Haojian Wu via cfe-commits
cfe-commits at lists.llvm.org
Wed Mar 2 00:54:02 PST 2022
Author: Haojian Wu
Date: 2022-03-02T09:53:52+01:00
New Revision: 28efb1ccf5eabd25119a3a7df2c2c1f1407dbfec
URL: https://github.com/llvm/llvm-project/commit/28efb1ccf5eabd25119a3a7df2c2c1f1407dbfec
DIFF: https://github.com/llvm/llvm-project/commit/28efb1ccf5eabd25119a3a7df2c2c1f1407dbfec.diff
LOG: [pseudo] Fix an out-of-bound error in LRTable::find.
The linear scan should not escape the TargetedStates range.
Differential Revision: https://reviews.llvm.org/D120723
Added:
Modified:
clang/lib/Tooling/Syntax/Pseudo/LRTable.cpp
clang/test/Syntax/lr-build-basic.test
Removed:
################################################################################
diff --git a/clang/lib/Tooling/Syntax/Pseudo/LRTable.cpp b/clang/lib/Tooling/Syntax/Pseudo/LRTable.cpp
index 23c455941ff5b..4f1494fff277d 100644
--- a/clang/lib/Tooling/Syntax/Pseudo/LRTable.cpp
+++ b/clang/lib/Tooling/Syntax/Pseudo/LRTable.cpp
@@ -110,14 +110,13 @@ llvm::ArrayRef<LRTable::Action> LRTable::find(StateID Src, SymbolID ID) const {
assert(llvm::is_sorted(TargetedStates) &&
"subrange of the StateIdx should be sorted!");
- const LRTable::StateID *It = llvm::partition_point(
+ const LRTable::StateID *Start = llvm::partition_point(
TargetedStates, [&Src](LRTable::StateID S) { return S < Src; });
- if (It == TargetedStates.end())
- return {};
- size_t Start = It - States.data(), End = Start;
- while (End < States.size() && States[End] == Src)
+ const LRTable::StateID *End = Start;
+ while (End != TargetedStates.end() && *End == Src)
++End;
- return llvm::makeArrayRef(&Actions[Start], End - Start);
+ return llvm::makeArrayRef(&Actions[Start - States.data()],
+ /*length=*/End - Start);
}
} // namespace pseudo
diff --git a/clang/test/Syntax/lr-build-basic.test b/clang/test/Syntax/lr-build-basic.test
index d6538338991e1..d02fdaefd7c2c 100644
--- a/clang/test/Syntax/lr-build-basic.test
+++ b/clang/test/Syntax/lr-build-basic.test
@@ -1,24 +1,29 @@
_ := expr
-expr := IDENTIFIER
+expr := id
+id := IDENTIFIER
# RUN: clang-pseudo -grammar %s -print-graph | FileCheck %s --check-prefix=GRAPH
# GRAPH: States:
# GRPAH-NEXT: State 0
# GRPAH-NEXT: _ := • expr
-# GRPAH-NEXT: expr := • IDENTIFIER
+# GRPAH-NEXT: expr := • id
+# GRPAH-NEXT: id := • IDENTIFIER
# GRPAH-NEXT: State 1
# GRPAH-NEXT: _ := expr •
# GRPAH-NEXT: State 2
-# GRPAH-NEXT: expr := IDENTIFIER •
-# GRPAH-NEXT: 0 ->[expr] 1
-# GRPAH-NEXT: 0 ->[IDENTIFIER] 2
+# GRPAH-NEXT: expr := id •
+# GRPAH-NEXT: State 3
+# GRPAH-NEXT: id := IDENTIFIER •
# RUN: clang-pseudo -grammar %s -print-table | FileCheck %s --check-prefix=TABLE
# TABLE: LRTable:
# TABLE-NEXT: State 0
-# TABLE-NEXT: 'IDENTIFIER': shift state 2
+# TABLE-NEXT: 'IDENTIFIER': shift state 3
# TABLE-NEXT: 'expr': go to state 1
+# TABLE-NEXT: 'id': go to state 2
# TABLE-NEXT: State 1
# TABLE-NEXT: 'EOF': accept
# TABLE-NEXT: State 2
-# TABLE-NEXT: 'EOF': reduce by rule 1 'expr := IDENTIFIER'
+# TABLE-NEXT: 'EOF': reduce by rule 1 'expr := id'
+# TABLE-NEXT: State 3
+# TABLE-NEXT: 'EOF': reduce by rule 2 'id := IDENTIFIER'
More information about the cfe-commits
mailing list