Branch: Tag:

2014-12-04

2014-12-04 19:24:56 by Henrik Grubbström (Grubba) <grubba@grubba.org>

Sprintf: Derive a stricter return type.

The sprintf attribute handler is now capable of deriving a return type.

509:   test_any([[ int a=0xffffffff; return a>>17 ]],    [[ (0xffffffff == -1)?-1:0x7fff ]]);    + dnl Check the derived return type of sprintf(). + test_any([[return sprintf("%O", typeof(sprintf("%1H", "foo"))); ]], +  "string(0..255)"); + test_any([[return sprintf("%O", typeof(sprintf("foo"))); ]], +  "string(102..111)"); + test_any([[return sprintf("%O", typeof(sprintf("foo%c", 17))); ]], +  "string(17..17 | 102..111)"); + test_any([[return sprintf("%O", typeof(sprintf("%2c\n", 'a'))); ]], +  "string(0..255)"); + test_any([[return sprintf("%O", typeof(sprintf("%c", 1023))); ]], +  "string(1023..1023)"); + test_any([[return sprintf("%O", typeof(sprintf("%c\n", 1023))); ]], +  "string(10..10 | 1023..1023)"); + test_any([[return sprintf("%O", typeof(sprintf("%c\n", Stdio))); ]], +  "string"); + test_any([[return sprintf("%O", typeof(sprintf("%4[1]c", 17))); ]], +  "string(0..255)"); + test_any([[return sprintf("%O", typeof(sprintf("%[1]n", 17))); ]], +  "string(zero)"); +    test_any([[return sprintf("%O", typeof(aggregate("foo")));]], "array(string(102..111))");   test_any([[int a; return sprintf("%O", typeof(aggregate(a)));]], "array(int)");   test_any([[int|string a;