Index: icu/source/i18n/regexcmp.cpp =================================================================== --- icu/source/i18n/regexcmp.cpp (revision 36726) +++ icu/source/i18n/regexcmp.cpp (revision 36727) @@ -2340,5 +2340,13 @@ if (fIntervalUpper == 0) { // Pathological case. Attempt no matches, as if the block doesn't exist. + // Discard the generated code for the block. + // If the block included parens, discard the info pertaining to them as well. fRXPat->fCompiledPat->setSize(topOfBlock); + if (fMatchOpenParen >= topOfBlock) { + fMatchOpenParen = -1; + } + if (fMatchCloseParen >= topOfBlock) { + fMatchCloseParen = -1; + } return TRUE; } Index: icu/source/i18n/regexcmp.h =================================================================== --- icu/source/i18n/regexcmp.h (revision 36726) +++ icu/source/i18n/regexcmp.h (revision 36727) @@ -188,5 +188,7 @@ // of the slot reserved for a state save // at the start of the most recently processed - // parenthesized block. + // parenthesized block. Updated when processing + // a close to the location for the corresponding open. + int32_t fMatchCloseParen; // The position in the pattern of the first // location after the most recently processed Index: icu/source/test/testdata/regextst.txt =================================================================== --- icu/source/test/testdata/regextst.txt (revision 36726) +++ icu/source/test/testdata/regextst.txt (revision 36727) @@ -1202,4 +1202,13 @@ "A|B|\U00010000" "hello \ud800" +# Bug 11369 +# Incorrect optimization of patterns with a zero length quantifier {0} + +"(.|b)(|b){0}\$(?#xxx){3}(?>\D*)" "AAAAABBBBBCCCCCDDDDEEEEE" +"(|b)ab(c)" "<0><1>ab<2>c" +"(|b){0}a{3}(D*)" "<0>aaa<2>" +"(|b){0,1}a{3}(D*)" "<0><1>aaa<2>" +"((|b){0})a{3}(D*)" "<0><1>aaa<3>" + # Bug 11370 # Max match length computation of look-behind expression gives result that is too big to fit in the @@ -1209,4 +1218,5 @@ "(?