# \[Bug #2323\] "Z".."Z".succ$B$,6u(B

**URL:** <https://www.ruby-forum.com/t/bug-2323-z-z-succ-b-6u-b/178290>\
**Category:** Development\
**Created:** [November 2, 2009, 8:20am UTC](https://www.ruby-forum.com/t/bug-2323-z-z-succ-b-6u-b/178290 "2009-11-02T08:20:01Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![asarih](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/9de053/32.png) [@asarih](https://www.ruby-forum.com/u/asarih)\
**Post date:** [November 2, 2009, 8:20am UTC](https://www.ruby-forum.com/t/bug-2323-z-z-succ-b-6u-b/178290/1 "2009-11-02T08:20:01Z")

</div>

Bug #2323: “Z”…“Z”.succe$B$,6ue(B  
[http://redmine.ruby-lang.org/issues/show/2323](http://redmine.ruby-lang.org/issues/show/2323)

e$B5/I\<\<Te(B: Hiro A.  
e$B%9%F!\<%?%9e(B: Open, e$BM%@hEYe(B: Normal  
e$B%+%F%4%je(B: core  
ruby -v: ruby 1.9.2dev (2009-11-02 trunk 25625) [x86\_64-darwin10.0.0]

surfboard:~$ ruby1.9 -v; ruby1.9 -e ‘p (“Z”…“Z”.succ); p  
(“Z”…“Z”.succ).to\_a’  
ruby 1.9.2dev (2009-11-02 trunk 25625) [x86\_64-darwin10.0.0]  
“Z”…“AA”  
[]

“Z”.succe$B$G$O$J$/$F$b$&$A$g$C$H!IN%$l$?!I%d%D$re(BRangee$B$N=\*$o$j$H$7$F;XDj$9$k$He(B"AA"e$B$O$7$C$+$j$HF~$C$F$$$^$9!#e(B

surfboard:~$ ruby1.9 -e ‘p (“Z”…“ZA”).include? “Z”.succ’  
true

e$B$G$bH\>C\<$J!IN%$l!IJ}$G$O$$$1$^$;$s!#e(B

surfboard:~$ ruby1.9 -e ‘p (“Z”…“CA”).include? “Z”.succ’  
false

to\_ae$B$r2p$7$F$bF1MM$G$9!#e(B

surfboard:~$ ruby1.9 -e ‘p (“Z”…“ZA”).to\_a.include? “Z”.succ’  
true  
surfboard:~$ ruby1.9 -e ‘p (“Z”…“CA”).to\_a.include? “Z”.succ’  
false

---

<div class="post-metadata">

**Author:** ![asarih](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/9de053/32.png) [@asarih](https://www.ruby-forum.com/u/asarih)\
**Post date:** [November 2, 2009, 6:16pm UTC](https://www.ruby-forum.com/t/bug-2323-z-z-succ-b-6u-b/178290/2 "2009-11-02T18:16:29Z")

</div>

e$B$J$+$@$G$9!#e(B

At Mon, 2 Nov 2009 16:19:40 +0900,  
Hiro A. wrote in [ruby-dev:39604]:

> surfboard:~$ ruby1.9 -v; ruby1.9 -e ‘p (“Z”…“Z”.succ); p (“Z”…“Z”.succ).to\_a’  
> ruby 1.9.2dev (2009-11-02 trunk 25625) [x86\_64-darwin10.0.0]  
> “Z”…“AA”  
> []

e$B$3$s$J$H$3$m$G$7$g$&$+!#e(B

# Index: string.c

— string.c (revision 25629)  
+++ string.c (working copy)  
@@ -2844,4 +2844,44 @@ rb\_str\_succ\_bang(VALUE str)  
}

+static int  
+str\_succ\_cmp(VALUE str1, VALUE str2, rb\_encoding \*enc)  
+{

- const char \*p1 = RSTRING\_PTR(str1), \*e1 = RSTRING\_END(str1);
- const char \*p2 = RSTRING\_PTR(str2), \*e2 = RSTRING\_END(str2);
- size\_t l1, l2;
- do {
- if (ISUPPER(\*p1) && ISUPPER(\*p2)) {
- 

```
 for (l1 = 1; p1+l1 < e1 && ISUPPER(p1[l1]); l1++);

```

- 

```
 for (l2 = 1; p2+l2 < e2 && ISUPPER(p2[l2]); l2++);

```

- }
- else if (ISLOWER(\*p1) && ISLOWER(\*p2)) {
- 

```
 for (l1 = 1; p1+l1 < e1 && ISLOWER(p1[l1]); l1++);

```

- 

```
 for (l2 = 1; p2+l2 < e2 && ISLOWER(p2[l2]); l2++);

```

- }
- else if (ISDIGIT(\*p1) && ISDIGIT(\*p2)) {
- 

```
 for (l1 = 1; p1+l1 < e1 && ISDIGIT(p1[l1]); l1++);

```

- 

```
 for (l2 = 1; p2+l2 < e2 && ISDIGIT(p2[l2]); l2++);

```

- }
- else {
- 

```
 int n, c;

```

- 

```
 for (l1 = 0; p1+l1 < e1; l1 += n) {

```

- c = rb\_enc\_ascget(p1+l1, e1, &n, enc);
- if (ISALNUM©) break;
- 

```
 }

```

- 

```
 for (l2 = 0; p2+l2 < e2; l2 += n) {

```

- c = rb\_enc\_ascget(p2+l2, e2, &n, enc);
- if (ISALNUM©) break;
- 

```
 }

```

- 

```
 if (l1 == 0 || l2 == 0) return 1;

```

- }
- if (l1 \> l2) return 1;
- if (l1 == l2) {
- 

```
 if (memcmp(p1, p2, l1) > 0) return 0;

```

- }
- p1 += l1;
- p2 += l2;
- } while (p1 \< e1 || p2 \< e2);
- return -(p1 == e1 && p2 == e2);  
+}

/\*  
@@ -2881,4 +2921,5 @@ rb\_str\_upto(int argc, VALUE \*argv, VALUE  
ID succ;  
int n, excl, ascii;

- char c, e;  
rb\_encoding \*enc;

@@ -2891,8 +2932,9 @@ rb\_str\_upto(int argc, VALUE _argv, VALUE  
ascii = (is\_ascii\_string(beg) && is\_ascii\_string(end));  
/_ single character \*/

- if (RSTRING\_LEN(beg) == 1 && RSTRING\_LEN(end) == 1 && ascii) {
- char c = RSTRING\_PTR(beg)[0];
- char e = RSTRING\_PTR(end)[0];
- 

- if (ascii &&
- RSTRING\_LEN(beg) == 1 && RSTRING\_LEN(end) == 1 &&
- (c = RSTRING\_PTR(beg)[0], ISALPHA©) &&
- (e = RSTRING\_PTR(end)[0], ISALPHA(e)) &&
- (ISUPPER© == ISUPPER(e))) {  
if (c \> e || (excl && c == e)) return beg;  
for (;😉 {  
@@ -2906,5 +2948,5 @@ rb\_str\_upto(int argc, VALUE _argv, VALUE  
/_ both edges are all digits \*/  
if (ascii && ISDIGIT(RSTRING\_PTR(beg)[0]) &&  
ISDIGIT(RSTRING\_PTR(end)[0])) {

- char \*s, \*send;

- const char \*s, \*send;  
VALUE b, e;  
int width;  
@@ -2949,5 +2991,8 @@ rb\_str\_upto(int argc, VALUE _argv, VALUE  
/_ normal case \*/  
no\_digits:

- n = rb\_str\_cmp(beg, end);

- if (ascii && rb\_enc\_str\_coderange(beg) ==  
rb\_enc\_str\_coderange(end))
- n = str\_succ\_cmp(beg, end, enc);
- else
- n = rb\_str\_cmp(beg, end);  
if (n \> 0 || (excl && n == 0)) return beg;

# Index: test/ruby/test\_range.rb

— test/ruby/test\_range.rb (revision 25629)  
+++ test/ruby/test\_range.rb (working copy)  
@@ -256,4 +256,7 @@ class TestRange \< Test::Unit::TestCase  
assert(!((“a”…“z”).include?(“z”)))  
assert(!((“a”…“z”).include?(“cc”)))

- assert((“Z”…“ZA”).include?(“AA”))
- assert(!(“Z”…“za”).include?(“AA”))
- assert((“Z”…“CA”).include?(“AA”))  
assert((0…10).include?(5))  
end  
Index: test/ruby/test\_string.rb  
===================================================================  
— test/ruby/test\_string.rb (revision 25629)  
+++ test/ruby/test\_string.rb (working copy)  
@@ -1588,4 +1588,8 @@ class TestString \< Test::Unit::TestCase  
})  
assert\_equal(676, count)
- 
- a = []
- S(“Z”).upto(S(“AA”)) {|s| a \<\< s}
- assert\_equal([S(“Z”), S(“AA”)], a)  
end

---

<div class="post-metadata">

**Author:** ![asarih](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/9de053/32.png) [@asarih](https://www.ruby-forum.com/u/asarih)\
**Post date:** [November 3, 2009, 8:44pm UTC](https://www.ruby-forum.com/t/bug-2323-z-z-succ-b-6u-b/178290/3 "2009-11-03T20:44:22Z")

</div>

e$B@uN$$G$9!#e(B

2009/11/2 Nobuyoshi N. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> e$B$J$+$@$G$9!#e(B
> 
> At Mon, 2 Nov 2009 16:19:40 +0900,  
> Hiro A. wrote in [ruby-dev:39604]:
> 
> > surfboard:~$ ruby1.9 -v; ruby1.9 -e ‘p (“Z”…“Z”.succ); p (“Z”…“Z”.succ).to\_a’  
> > ruby 1.9.2dev (2009-11-02 trunk 25625) [x86\_64-darwin10.0.0]  
> > “Z”…“AA”  
> > []
> 
> e$B$3$s$J$H$3$m$G$7$g$&$+!#e(B

e$B$3$N%Q%C%A$G7o$NLdBj$O2r7h$5$l$F$$$^$9$,!"$A$g$C$HJL$J$H$3$m$GLdBj$K$J$k$+$b$7$l$^$;$s!#e(B

e$B$3$N%Q%C%A$rEv$F$F$\_$?$H$3$m!“e(B"Z”…"a"e$B$O6u$G$9!#e(B1.8e$B$G$Oe(B[“Z”]e$B$,JV$C$F$-$^$9!#e(B

e$B99$K!"e(B  
[http://redmine.ruby-lang.org/issues/show/1891e$B$K$"$k$h$&$K!"e](http://redmine.ruby-lang.org/issues/show/1891e$B$K$%22$k$h$&$K!%22e)(B  
e$B%Q%C%AL5$7$G$Oe(B[“Z”, “[”, “\”, “]”, “^”, “\_”, “`”,  
“a”]e$B$G$9!#e(B  
e$B$3$l$KBP1~$7$?%j%S%8%g%s!Je(Br24573e$B!K$G$O2C$($Fe(B:Z…:ae$B$,G’$a$i$l$F$$$F!“e(B  
e$B$=$l$K$O%”%9%-!\<G[Ns$KB’$C$?%7%s%%k$,4^$^$l$F$$$^$9!#e(B

e$B8D?ME\*$K$Oe(B"Z".succe$B$,e(B"AA"e$B$G$"$k$J$i$P!"Fs$D0J\>e$NMWAG$r;}$De(B"Z"e$B$+$i;O$^$ke(BRangee$B$Oe(B"AA"e$B$r4^$`$Y$-$@$H9M$($^$9!#e(B  
Rangee$B$rH\>=g=x=89g$KDj5A$9$k$N$b2DG=$H$O;W$$$^$9$,!“FCJL$JF0$-$r$9$k;v$,$”$k$N$J$i$P!"e(B  
e$B$=$l$OL@3N$K=q$+$l$F$$$J$$$H:.Mp$r\>7$/$H;W$$$^$9!#e(B

e$B;29M$^$G$K;XE&$7$F$\*$-$^$9!#e(B

---

<div class="post-metadata">

**Author:** ![asarih](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/9de053/32.png) [@asarih](https://www.ruby-forum.com/u/asarih)\
**Post date:** [November 3, 2009, 9:34pm UTC](https://www.ruby-forum.com/t/bug-2323-z-z-succ-b-6u-b/178290/4 "2009-11-03T21:34:44Z")

</div>

e$B@.@%$G$9!#e(B

Yukihiro M. wrote:

> e$BJ8;zNs$Ne(BRangee$B$K$D$$$F$O!"e(B
> 
> - e$BN\>C\<$H$be(BASCII1e$BJ8;z$G$"$k\>l9g$K$O!"e(BASCIIe$BJ8;z%3!\<%IE\*$J=g=xe(B
> 
> e$B$K$J$C$F$^$9!#$G!"$3$N$$$:$l$K$b$"$F$O$^$i$J$$%1!\<%9$N;EMM$Oe(B  
> e$B@5D\>3NDj$7$F$^$;$s!#6lO+$7$F$b$"$s$^$j;H$o$l$J$5$=$&$@$7!#e(B

e$BG0$N$?$aJdB-$7$F$_$-$^$9$H!“e(B  
Range#each e$B$N%^%K%e%”%k$K$Oe(B succ  
e$B$rMQ$$$k$H=q$$$F$"$j$^$9$,!"e(B  
String e$B$de(B Symbol e$B$N\>l9g$O\<B:]$K$Oe(B upto e$B$r8F$s$G$_$j!"e(B  
String#upto e$B$O\>o$K$Oe(B String#succ e$B$r8F$s$G$$$^$;$s!#e(B  
e$B\>e5-$N$^$D$b$H$5$s$N@bL@$Oe(B String#upto e$B$N@bL@$K$J$j$^$9!#e(B

e$B8@$$49$($k$H!"e(BRange#to\_a e$B$+$ie(B Range#eache$B$,8F$P$l!"e(B  
range\_each e$B7PM3$Ge(B String#upto e$B$K9T$C$F$$$k$N$G!"e(B  
e$B$3$NLdBj$O0J2\<$N$h$&$K=q$-49$($k$3$H$,=PMh$^$9!#e(B

% ruby19 -ve’“Z”.upto(“AA”){|x|p x}’  
ruby 1.9.2dev (2009-11-02 trunk 25632) [x86\_64-freebsd8.0]

> e$B$"$H$O!"$"$kJ8;zNs$+$iJL$Ne(B  
> e$BJ8;zNs$Ke(Bsucce$B$NO":?$GE~C#$G$-$k$+$I$&$+4J0W$KH=Dj$G$-$k$N$G$“e(B  
> e$B$l$P!”$=$l$K=\>$C$F=g=x$r=hM}$9$k$HNI$$$H;W$&$N$G$9$1$I!"$G$-e(B  
> e$B$k$s$@$C$1$+!#e(B

e$B$A$g$C$H4J0W$H$O8@$$$E$i$$5$$,$7$^$9!#e(B  
e$B@h$NCfED$5$s$N%Q%C%A$@$He(B “0 0” e$B$+$iE~C#$G$-$J$$e(B “0 00”  
e$B$KBP$7$F!"e(B  
upto e$B$,HyL/$KF0$$$?$j$7$F$$$^$9!#e(B  
“0 0”.upto(“0 00”){|x|p x}

e$B1Q?t$N4V$KHs1Q?t$,$O$5$^$C$?$j!“Hs1Q?t$,7+$j\>e$,$C$F1Q?t$KFMF~$9$k%1!\<%9$Oe(B  
e$B$J$+$J$+Fq$7$$$h$&$K;W$$$^$9!#e(B  
e$B0lEY$-$C$A$j9M$($FJ8=q2=$7$5$($9$l$P!”$"$H$O\<BAu$9$k$@$1$G$O$"$j$^$9$,!#e(B

e$BBeBX0F$H$7$F!"\>o$Ke(B succ  
e$B$r;H$&$h$&$K$7$F!"$J$s$H$J$/F0$/$h$&$K$7$D$D!“e(B  
e$B$H$j$”$($:3N\<B$KDd;_$9$k$h$&$K$9$k$H$$$&J}K!$b$"$j$^$9$+$M!#e(B  
e$BCfED$5$s$N%Q%C%A$O$=$N$h$&$J\<q;]$G$"$k$h$&$K$_$($^$9!#e(B

---

<div class="post-metadata">

**Author:** ![asarih](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/9de053/32.png) [@asarih](https://www.ruby-forum.com/u/asarih)\
**Post date:** [November 3, 2009, 8:59pm UTC](https://www.ruby-forum.com/t/bug-2323-z-z-succ-b-6u-b/178290/5 "2009-11-03T20:59:36Z")

</div>

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:39622] Re: [Bug #2323]  
“Z”…“Z”.succe$B$,6ue(B”  
on Tue, 3 Nov 2009 22:22:58 +0900, Hiro A. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
writes:

|e$B8D?ME\*$K$Oe(B"Z".succe$B$,e(B"AA"e$B$G$"$k$J$i$P!"Fs$D0J\>e$NMWAG$r;}$De(B"Z"e$B$+$i;O$^$ke(BRangee$B$Oe(B"AA"e$B$r4^$`$Y$-$@$H9M$($^$9!#e(B  
|Rangee$B$rH\>=g=x=89g$KDj5A$9$k$N$b2DG=$H$O;W$$$^$9$,!“FCJL$JF0$-$r$9$k;v$,$”$k$N$J$i$P!"e(B  
|e$B$=$l$OL@3N$K=q$+$l$F$$$J$$$H:.Mp$r\>7$/$H;W$$$^$9!#e(B

e$BJ8;zNs$Ne(BRangee$B$K$D$$$F$O!"e(B

- 

e$BJ8;zNs$N=g=x$NDj5A$,J#?t$"$ke(B(e$B\<-=q=g$He(Bsucce$B$K$h$k$b$Ne(B)

- Rangee$B$Oe(Bsucce$B$r;H$&$,!"$3$l$OH\>=g=x=89g$G$$$m$$$mLLE]e(B

e$B$H$$$&;v\>p$,$"$j$^$9!#$G!“8=:\_!”$A$g$C$HCfESH\>C\<$J\>uBV$K$J$Ce(B  
e$B$F$^$9!#:G=_E_$J;EMM$r8!F$$9$k;~4Ve(B(e$B$H$d$k5$e(B)e$B$,\<h$l$J$/$F!#e(B

e$B8=\>ue(B

- e$BN\>C\<$H$b$9$Y$Fe(BASCIIe$B?t;z$G$“$k\>l9g$K$O!”?tE\*$J=g=xe(B
- 

e$BN\>C\<$H$be(BASCII1e$BJ8;z$G$"$k\>l9g$K$O!"e(BASCIIe$BJ8;z%3!\<%IE\*$J=g=xe(B

e$B$K$J$C$F$^$9!#$G!“$3$N$$$:$l$K$b$”$F$O$^$i$J$$%1!\<%9$N;EMM$Oe(B  
e$B@5D\>3NDj$7$F$^$;$s!#6lO+$7$F$b$"$s$^$j;H$o$l$J$5$=$&$@$7!#e(B  
e$B$?$@!"e(B

- 

e$BN\>C\<$,6&DL$N@hF,ItJ,$r;}$A!“Hs6&DLItJ,$,$9$Y$Fe(BASCIIe$B?t;z$Ge(B  
e$B$”$k\>l9g$K$O?tE\*$J=g=xe(B

e$B$H$$$&$N$O:NMQ$7$h$&$H;W$C$F$^$9!#$“$H$O!”$“$kJ8;zNs$+$iJL$Ne(B  
e$BJ8;zNs$Ke(Bsucce$B$NO”:?$GE~C#$G$-$k$+$I$&$+4J0W$KH=Dj$G$-$k$N$G$“e(B  
e$B$l$P!”$=$l$K=\>$C$F=g=x$r=hM}$9$k$HNI$$$H;W$&$N$G$9$1$I!"$G$-e(B  
e$B$k$s$@$C$1$+!#e(B

```
                            e$B$^$D$b$He(B e$B$f$-$R$me(B /:|)

```

---

<div class="post-metadata">

**Author:** ![asarih](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/9de053/32.png) [@asarih](https://www.ruby-forum.com/u/asarih)\
**Post date:** [December 14, 2009, 4:08am UTC](https://www.ruby-forum.com/t/bug-2323-z-z-succ-b-6u-b/178290/6 "2009-12-14T04:08:16Z")

</div>

e$B%A%1%C%He(B #2323 e$B$,99?7$5$l$^$7$?!#e(B (by Yui NARUSE)

e$B%+%F%4%je(B coree$B$K%;%C%He(B  
e$B%9%F!\<%?%9e(B Opene$B$+$ie(BAssignede$B$KJQ99e(B  
e$BC4Ev\<Te(B Yukihiro M.e$B$K%;%C%He(B  
e$BM%@hEYe(B Normale$B$+$ie(BLowe$B$KJQ99e(B

## Ruby 1.9 Feature e$B$K0\F0$7$?\>e$G!"M%@hEYe(B Low e$B$K$7$F$\*$-$^$9e(B

[http://redmine.ruby-lang.org/issues/show/2323](http://redmine.ruby-lang.org/issues/show/2323)
