diff options
author | David Greene <greened@obbligato.org> | 2009-12-21 21:21:34 +0000 |
---|---|---|
committer | David Greene <greened@obbligato.org> | 2009-12-21 21:21:34 +0000 |
commit | f660802f348e4e57ef9df8d30be74b894259badb (patch) | |
tree | 4ad5603c0f42c4d15e5b60b3c5a3464cf1842ab9 | |
parent | 7b1eb8a4091ff4e76323ce2d4a42d5d14b5e3f50 (diff) | |
download | external_llvm-f660802f348e4e57ef9df8d30be74b894259badb.zip external_llvm-f660802f348e4e57ef9df8d30be74b894259badb.tar.gz external_llvm-f660802f348e4e57ef9df8d30be74b894259badb.tar.bz2 |
Fix a bug in !subst where TableGen would go and resubstitute text it had
just substituted. This could cause infinite looping in certain
pathological cases.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@91843 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | test/TableGen/subst2.td | 15 | ||||
-rw-r--r-- | utils/TableGen/Record.cpp | 4 |
2 files changed, 18 insertions, 1 deletions
diff --git a/test/TableGen/subst2.td b/test/TableGen/subst2.td new file mode 100644 index 0000000..3366c9d --- /dev/null +++ b/test/TableGen/subst2.td @@ -0,0 +1,15 @@ +// RUN: tblgen %s | FileCheck %s +// CHECK: No subst +// CHECK: No foo +// CHECK: RECURSE foo + +class Recurse<string t> { + string Text = t; +} + +class Text<string text> : + Recurse<!subst("RECURSE", "RECURSE", !subst("NORECURSE", "foo", text))>; + +def Ok1 : Text<"No subst">; +def Ok2 : Text<"No NORECURSE">; +def Trouble : Text<"RECURSE NORECURSE">; diff --git a/utils/TableGen/Record.cpp b/utils/TableGen/Record.cpp index 53f9014..542735e 100644 --- a/utils/TableGen/Record.cpp +++ b/utils/TableGen/Record.cpp @@ -945,11 +945,13 @@ Init *TernOpInit::Fold(Record *CurRec, MultiClass *CurMultiClass) { std::string Val = RHSs->getValue(); std::string::size_type found; + std::string::size_type idx = 0; do { - found = Val.find(LHSs->getValue()); + found = Val.find(LHSs->getValue(), idx); if (found != std::string::npos) { Val.replace(found, LHSs->getValue().size(), MHSs->getValue()); } + idx = found + MHSs->getValue().size(); } while (found != std::string::npos); return new StringInit(Val); |