diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 9d7f41853..e283262f7 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -1965,7 +1965,7 @@ bool CheckUninitVar::isMemberVariableUsage(const Token *tok, bool isPointer, All if (isMemberVariableAssignment(tok, membervar)) return false; - if (Token::Match(tok, "%name% . %name%") && tok->strAt(2) == membervar) + if (Token::Match(tok, "%name% . %name%") && tok->strAt(2) == membervar && !(tok->tokAt(-2)->variable() && tok->tokAt(-2)->variable()->isReference())) return true; else if (!isPointer && Token::Match(tok->previous(), "[(,] %name% [,)]") && isVariableUsage(tok, isPointer, alloc)) return true; diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 30ddf2431..56067b6f0 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -1705,6 +1705,15 @@ private: " strchr(s.c_str(), ',');\n" "}"); ASSERT_EQUALS("", errout.str()); + + // #6717 + checkUninitVarB("void f() {\n" + " struct thing { int value; };\n" + " thing it;\n" + " int& referenced_int = it.value;\n" + " referenced_int = 123;\n" + "}"); + ASSERT_EQUALS("", errout.str()); } void uninitvar_return() {