diff --git a/cfg/std.cfg b/cfg/std.cfg
index 6cd0c371a5e..b441970adaa 100644
--- a/cfg/std.cfg
+++ b/cfg/std.cfg
@@ -9050,7 +9050,7 @@ initializer list (7) string& replace (const_iterator i1, const_iterator i2, init
std::scoped_lock
std::unique_lock
std::shared_lock
- std::pair
+ std::pair
std::complex
std::exception
std::logic_error
diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp
index 5819eed715e..24fcf38e384 100644
--- a/lib/checkunusedvar.cpp
+++ b/lib/checkunusedvar.cpp
@@ -724,10 +724,9 @@ void CheckUnusedVar::checkFunctionVariableUsage_iterateScopes(const Scope* const
type = Variables::pointer;
else if (mTokenizer->isC() ||
i->typeEndToken()->isStandardType() ||
- i->isStlType() ||
+ (i->valueType() && i->valueType()->container) ||
mTokenizer->getSymbolDatabase()->isRecordTypeWithoutSideEffects(i->type()) ||
- mSettings->library.detectContainer(i->typeStartToken()) ||
- mSettings->library.getTypeCheck("unusedvar", i->typeStartToken()->str()) == Library::TypeCheck::check)
+ mSettings->library.getTypeCheck("unusedvar", i->getTypeName()) == Library::TypeCheck::check)
type = Variables::standard;
if (type == Variables::none || isPartOfClassStructUnion(i->typeStartToken()))
diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp
index 0a676d00218..6fa5d80751d 100644
--- a/test/testunusedvar.cpp
+++ b/test/testunusedvar.cpp
@@ -6597,6 +6597,11 @@ class TestUnusedVar : public TestFixture {
" }\n"
"}\n");
ASSERT_EQUALS("[test.cpp:2:23]: (style) Variable 's' is assigned a value that is never used. [unreadVariable]\n", errout_str());
+
+ functionVariableUsage("void f() {\n" // #14201
+ " std::pair p;\n"
+ "}\n");
+ ASSERT_EQUALS("", errout_str());
}
void localVarClass() {