stdcxx-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Travis Vitek" <Travis.Vi...@roguewave.com>
Subject RE: [jira] Commented: (STDCXX-901) 26.class.gslice test fails
Date Tue, 03 Jun 2008 17:49:02 GMT
 

>Martin Sebor commented on STDCXX-901:
>-------------------------------------
>
>This is from the binary incompatible rewrite of {{valarray}} 
>that I've been mentioning for eons (I should finally commit it 
>on trunk). If it fixes this bug it might spark an idea for a 
>compatible fix...
>

Martin,

I'm struggling with what appears to a discrepancy between the standard
and the two implementations I'm testing with. According to
lib.gslice.cons, a default constructed slice specifies no elements.
Section lib.class.gslice describes gslices that do have lengths and
strides. The example it gives is shown here

   start  = 3
   length = { 2,  4, 3 }
   stride = { 19, 4, 1 }

   k = 3 + (0,1) * 19 + (0,1,2,3) * 4 + (0,1,2) * 1

   i0, i1, i2, k
   (0,  0,  0, 3 ) // = 3 + (0) * 19 + (0) * 4 + (0) * 1
   (0,  0,  1, 4 ) // = 3 + (0) * 19 + (0) * 4 + (1) * 1
   (0,  0,  2, 5 ) // = 3 + (0) * 19 + (0) * 4 + (2) * 1
   (0,  1,  0, 7 ) // = 3 + (0) * 19 + (1) * 4 + (0) * 1
   (0,  1,  1, 8 ) // = 3 + (0) * 19 + (1) * 4 + (1) * 1
   (0,  1,  2, 9 ) // = 3 + (0) * 19 + (1) * 4 + (2) * 1
   (0,  2,  0, 11) // = 3 + (0) * 19 + (2) * 4 + (0) * 1
   (0,  2,  1, 12) // = 3 + (0) * 19 + (2) * 4 + (1) * 1
   (0,  2,  2, 13) // = 3 + (0) * 19 + (2) * 4 + (2) * 1
   (0,  3,  0, 15) // = 3 + (0) * 19 + (3) * 4 + (0) * 1
   (0,  3,  1, 16) // = 3 + (0) * 19 + (3) * 4 + (1) * 1
   (0,  3,  2, 17) // = 3 + (0) * 19 + (3) * 4 + (2) * 1
   (1,  0,  0, 22) // = 3 + (1) * 19 + (0) * 4 + (0) * 1
   (1,  0,  1, 23) // = 3 + (1) * 19 + (0) * 4 + (1) * 1
   ...
   (1,  3,  2, 36) // = 3 + (1) * 19 + (3) * 4 + (2) * 1

Assume for a moment that we have the following gslice...

    start  = 0
    length = { 0 }
    stride = { 0 }

So the indices specified by this slice should be

    k = 0 + () * 0

    i0, i1, k
    (0, (), 0) // = 0 + () * 0

So this slice should be a view of 0th element in a given array.

I wrote a quick testcase to make sure that I was understanding this
gslice stuff correctly. It creates a valarray and a slice from strings,
then assigns 0 to the resulting gslice_array. This zeros out all
elements specified by the slice. Here is the set of testcases...

int main ()
{
      //               + length
      //               |    +- stride
      //               |    |
      //               v    v
      test ("1@10", 0, "",  "");
      test ("1@10", 0, "0", "0");
      test ("1@10", 0, "1", "1");
      test ("1@10", 0, "1", "2");
      test ("1@10", 0, "1", "3");

      test ("1@10", 0, "2", "1");
      test ("1@10", 0, "2", "2");
      test ("1@10", 0, "3", "3");
      test ("1@10", 0, "2", "3");

      test ("1@10", 0, "5", "1");
      test ("1@10", 1, "5", "1");
      test ("1@10", 1, "5,2", "1,2");

      test ("1@10", 0, "0,0,0", "1,2,3");

      return 0;
  }

And here is the output I get with the Dinkum and gnu implementations...

  {1,1,1,1,1,1,1,1,1,1}[0,{},{}]           = 0
      => = {1,1,1,1,1,1,1,1,1,1}
  {1,1,1,1,1,1,1,1,1,1}[0,{0},{0}]         = 0
      => {1,1,1,1,1,1,1,1,1,1}
  {1,1,1,1,1,1,1,1,1,1}[0,{1},{1}]         = 0
      => {0,1,1,1,1,1,1,1,1,1}
  {1,1,1,1,1,1,1,1,1,1}[0,{1},{2}]         = 0
      => {0,1,1,1,1,1,1,1,1,1}
  {1,1,1,1,1,1,1,1,1,1}[0,{1},{3}]         = 0
      => {0,1,1,1,1,1,1,1,1,1}
  {1,1,1,1,1,1,1,1,1,1}[0,{2},{1}]         = 0
      => {0,0,1,1,1,1,1,1,1,1}
  {1,1,1,1,1,1,1,1,1,1}[0,{2},{2}]         = 0
      => {0,1,0,1,1,1,1,1,1,1}
  {1,1,1,1,1,1,1,1,1,1}[0,{3},{3}]         = 0
      => {0,1,1,0,1,1,0,1,1,1}
  {1,1,1,1,1,1,1,1,1,1}[0,{2},{3}]         = 0
      => {0,1,1,0,1,1,1,1,1,1}
  {1,1,1,1,1,1,1,1,1,1}[0,{5},{1}]         = 0
      => {0,0,0,0,0,1,1,1,1,1}
  {1,1,1,1,1,1,1,1,1,1}[1,{5},{1}]         = 0
      => {1,0,0,0,0,0,1,1,1,1}
  {1,1,1,1,1,1,1,1,1,1}[1,{5,2},{1,2}]     = 0
      => {1,0,0,0,0,0,0,0,1,1}
  {1,1,1,1,1,1,1,1,1,1}[0,{0,0,0},{1,2,3}] = 0
      => {1,1,1,1,1,1,1,1,1,1}

The STLPort and RW implementations both get stuck in an infinite loop on
the second testcase, so I'm pretty sure that they're broken. I can't
find anything in the standard that says this would be unspecified or
undefined behavior and I don't see anything that calls this out as a
special case. This leads me to believe that this is a bug in both
implementations and I should take it into consideration when applying
any fix.

Travis

Mime
View raw message