Support most cases of sizeof applied to an expression
Previously there was only support for `sizeof(<type>)` and expressions which syntactically look like a type (such as `sizeof(foo)`). Fixes #2091.
This commit is contained in:
parent
6f952806e4
commit
7ab24e7e86
3 changed files with 46 additions and 0 deletions
|
|
@ -7,6 +7,12 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/
|
||||||
Version 4.1.0 (in progress)
|
Version 4.1.0 (in progress)
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
|
2022-01-25: olly
|
||||||
|
#2091 Support most cases of `sizeof` applied to an expression
|
||||||
|
in constant expressions. Previously there was only support for
|
||||||
|
`sizeof(<type>)` and expressions which syntactically look like a
|
||||||
|
type (such as `sizeof(foo)`).
|
||||||
|
|
||||||
2022-01-25: olly
|
2022-01-25: olly
|
||||||
#80 #635 https://sourceforge.net/p/swig/bugs/1139/
|
#80 #635 https://sourceforge.net/p/swig/bugs/1139/
|
||||||
Add support for parsing common cases of `<` and `>` comparisons
|
Add support for parsing common cases of `<` and `>` comparisons
|
||||||
|
|
|
||||||
|
|
@ -32,4 +32,25 @@ double d_array[12 % 9];
|
||||||
#define TEST_I 0
|
#define TEST_I 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* sizeof didn't work on an expression before SWIG 4.1.0 except for cases where
|
||||||
|
* the expression was in parentheses and looked syntactically like a type (so
|
||||||
|
* sizeof(X) worked because X could be a type syntactically).
|
||||||
|
*/
|
||||||
|
const int s1a = sizeof(X); /* worked before 4.1.0 */
|
||||||
|
//const int s1b = sizeof X; /* not currently supported */
|
||||||
|
const int s2a = sizeof("a string" );
|
||||||
|
const int s2b = sizeof "a string";
|
||||||
|
const int s3a = sizeof('c');
|
||||||
|
const int s3b = sizeof('c');
|
||||||
|
const int s4a = sizeof(L"a wstring");
|
||||||
|
const int s4b = sizeof L"a wstring";
|
||||||
|
const int s5a = sizeof(L'C');
|
||||||
|
const int s5b = sizeof L'C';
|
||||||
|
const int s6a = sizeof(sizeof(X));
|
||||||
|
const int s6b = sizeof sizeof(X);
|
||||||
|
const int s7a = sizeof(3.14);
|
||||||
|
const int s7b = sizeof 3.14;
|
||||||
|
const int s8a = sizeof(2.1e-6);
|
||||||
|
const int s8b = sizeof 2.1e-6;
|
||||||
|
|
||||||
%}
|
%}
|
||||||
|
|
|
||||||
|
|
@ -6554,6 +6554,25 @@ exprsimple : exprnum {
|
||||||
$$.val = NewStringf("sizeof...(%s)",SwigType_str($6,0));
|
$$.val = NewStringf("sizeof...(%s)",SwigType_str($6,0));
|
||||||
$$.type = T_ULONG;
|
$$.type = T_ULONG;
|
||||||
}
|
}
|
||||||
|
/* We don't support all valid expressions here currently - e.g.
|
||||||
|
* sizeof(<unaryop> x) doesn't work - but those are unlikely to
|
||||||
|
* be seen in real code.
|
||||||
|
*
|
||||||
|
* Note: sizeof(x) is not handled here, but instead by the rule
|
||||||
|
* for sizeof(<type>) because it matches that syntactically.
|
||||||
|
*/
|
||||||
|
| SIZEOF LPAREN exprsimple RPAREN {
|
||||||
|
$$.val = NewStringf("sizeof(%s)", $3.val);
|
||||||
|
$$.type = T_ULONG;
|
||||||
|
}
|
||||||
|
/* `sizeof expr` without parentheses is valid for an expression,
|
||||||
|
* but not for a type. This doesn't support `sizeof x` in
|
||||||
|
* addition to the case not supported above.
|
||||||
|
*/
|
||||||
|
| SIZEOF exprsimple {
|
||||||
|
$$.val = NewStringf("sizeof(%s)", $2.val);
|
||||||
|
$$.type = T_ULONG;
|
||||||
|
}
|
||||||
| wstring {
|
| wstring {
|
||||||
$$.val = $1;
|
$$.val = $1;
|
||||||
$$.rawval = NewStringf("L\"%s\"", $$.val);
|
$$.rawval = NewStringf("L\"%s\"", $$.val);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue