diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index e5509c2fc6c..2eea71e3bfd 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -3747,13 +3747,15 @@ bool Variable::arrayDimensions(const Settings& settings, bool& isContainer) // TODO: collect timing information for this call? ValueFlow::valueFlowConstantFoldAST(const_cast(dimension_.tok), settings); if (dimension_.tok) { - if (const ValueFlow::Value* v = dimension_.tok->getKnownValue(ValueFlow::Value::ValueType::INT)) + if (const ValueFlow::Value* v = dimension_.tok->getKnownValue(ValueFlow::Value::ValueType::INT)) { dimension_.num = v->intvalue; + dimension_.known = true; + } else if (dimension_.tok->isTemplateArg() && !dimension_.tok->values().empty()) { assert(dimension_.tok->values().size() == 1); dimension_.num = dimension_.tok->values().front().intvalue; + dimension_.known = true; } - dimension_.known = true; } } mDimensions.push_back(dimension_); diff --git a/test/testother.cpp b/test/testother.cpp index e67b5f64a70..607b8075e33 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -8852,6 +8852,13 @@ class TestOther : public TestFixture { " f(0);\n" "}"); ASSERT_EQUALS("", errout_str()); + + // #13734 + check("void f() {\n" + " uint8_t a[N + 1];\n" + " for (unsigned p = 0; p < (sizeof(a) / sizeof((a)[0])); ++p) {}\n" + "}"); + ASSERT_EQUALS("", errout_str()); } void checkSignOfPointer() { diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index 82a91d14a30..b29f069ed56 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -1687,6 +1687,16 @@ class TestValueFlow : public TestFixture { values = tokenValues(code, "="); ASSERT_EQUALS(1U, values.size()); ASSERT_EQUALS(4LL * 5, values.back().intvalue); + + // #13734 + code = "void f() {\n" + " int a[N + 1];" + " x = sizeof(a) / sizeof(a[0]);\n" + "}"; + values = tokenValues(code,"/"); + ASSERT_EQUALS(1U, values.size()); + ASSERT_EQUALS(-1, values.back().intvalue); + ASSERT_EQUALS_ENUM(ValueFlow::Value::ValueKind::Impossible, values.back().valueKind); } void valueFlowComma()