| 569 | } |
| 570 | |
| 571 | void valueFlowNumber() { |
| 572 | ASSERT_EQUALS(123, valueOfTok("x=123;", "123").intvalue); |
| 573 | ASSERT_EQUALS_DOUBLE(192.0, valueOfTok("x=0x0.3p10;", "0x0.3p10").floatValue, 1e-5); // 3 * 16^-1 * 2^10 = 192 |
| 574 | ASSERT(std::fabs(valueOfTok("x=0.5;", "0.5").floatValue - 0.5) < 0.1); |
| 575 | ASSERT_EQUALS(10, valueOfTok("enum {A=10,B=15}; x=A+0;", "+").intvalue); |
| 576 | ASSERT_EQUALS(0, valueOfTok("x=false;", "false").intvalue); |
| 577 | ASSERT_EQUALS(1, valueOfTok("x=true;", "true").intvalue); |
| 578 | ASSERT_EQUALS(0, valueOfTok("x(NULL);", "NULL").intvalue); |
| 579 | ASSERT_EQUALS(static_cast<int>('a'), valueOfTok("x='a';", "'a'").intvalue); |
| 580 | ASSERT_EQUALS(static_cast<int>('\n'), valueOfTok("x='\\n';", "'\\n'").intvalue); |
| 581 | TODO_ASSERT_EQUALS(0xFFFFFFFF00000000, 0, valueOfTok("x=0xFFFFFFFF00000000;", "0xFFFFFFFF00000000").intvalue); // #7701 |
| 582 | ASSERT_EQUALS_DOUBLE(16, valueOfTok("x=(double)16;", "(").floatValue, 1e-5); |
| 583 | ASSERT_EQUALS_DOUBLE(0.0625, valueOfTok("x=1/(double)16;", "/").floatValue, 1e-5); |
| 584 | |
| 585 | const Settings settingsC23 = settingsBuilder().c(Standards::C23).build(); |
| 586 | ASSERT_EQUALS(1, valueOfTok("x=true;", "true", &settingsC23, false).intvalue); |
| 587 | ASSERT_EQUALS(0, valueOfTok("x=false;", "false", &settingsC23, false).intvalue); |
| 588 | |
| 589 | const Settings settingsC17 = settingsBuilder().c(Standards::C17).build(); |
| 590 | ASSERT(!valueOfTok("x=true;", "true", &settingsC17, false).isKnown()); |
| 591 | ASSERT(!valueOfTok("x=false;", "false", &settingsC17, false).isKnown()); |
| 592 | |
| 593 | // scope |
| 594 | { |
| 595 | const char code[] = "namespace N { enum E {e0,e1}; }\n" |
| 596 | "void foo() { x = N::e1; }"; |
| 597 | ASSERT_EQUALS(1, valueOfTok(code, "::").intvalue); |
| 598 | } |
| 599 | |
| 600 | ASSERT_EQUALS(63, valueOfTok("x = 3 * uint32_t{21};", "*").intvalue); |
| 601 | } |
| 602 | |
| 603 | void valueFlowString() { |
| 604 | const char *code; |