Fixed #3552 (Don't warn about missing ctor for class inside union)
This commit is contained in:
parent
c7b3836379
commit
50352c8d69
|
@ -90,8 +90,21 @@ void CheckClass::constructors()
|
||||||
for (std::size_t i = 0; i < classes; ++i) {
|
for (std::size_t i = 0; i < classes; ++i) {
|
||||||
const Scope * scope = symbolDatabase->classAndStructScopes[i];
|
const Scope * scope = symbolDatabase->classAndStructScopes[i];
|
||||||
|
|
||||||
|
bool usedInUnion = false;
|
||||||
|
for (std::list<Scope>::const_iterator it = symbolDatabase->scopeList.begin(); it != symbolDatabase->scopeList.end(); ++it) {
|
||||||
|
if (it->type != Scope::eUnion)
|
||||||
|
continue;
|
||||||
|
const Scope &unionScope = *it;
|
||||||
|
for (std::list<Variable>::const_iterator var = unionScope.varlist.begin(); var != unionScope.varlist.end(); ++var) {
|
||||||
|
if (var->type() && var->type()->classScope == scope) {
|
||||||
|
usedInUnion = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// There are no constructors.
|
// There are no constructors.
|
||||||
if (scope->numConstructors == 0 && printStyle) {
|
if (scope->numConstructors == 0 && printStyle && !usedInUnion) {
|
||||||
// If there is a private variable, there should be a constructor..
|
// If there is a private variable, there should be a constructor..
|
||||||
std::list<Variable>::const_iterator var;
|
std::list<Variable>::const_iterator var;
|
||||||
for (var = scope->varlist.begin(); var != scope->varlist.end(); ++var) {
|
for (var = scope->varlist.begin(); var != scope->varlist.end(); ++var) {
|
||||||
|
|
|
@ -75,6 +75,7 @@ private:
|
||||||
TEST_CASE(noConstructor8); // ticket #4404
|
TEST_CASE(noConstructor8); // ticket #4404
|
||||||
TEST_CASE(noConstructor9); // ticket #4419
|
TEST_CASE(noConstructor9); // ticket #4419
|
||||||
TEST_CASE(noConstructor10); // ticket #6614
|
TEST_CASE(noConstructor10); // ticket #6614
|
||||||
|
TEST_CASE(noConstructor11); // ticket #3552
|
||||||
|
|
||||||
TEST_CASE(forwardDeclaration); // ticket #4290/#3190
|
TEST_CASE(forwardDeclaration); // ticket #4290/#3190
|
||||||
|
|
||||||
|
@ -561,6 +562,12 @@ private:
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void noConstructor11() { // #3552
|
||||||
|
check("class Fred { int x; };\n"
|
||||||
|
"union U { int y; Fred fred; };");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
// ticket #4290 "False Positive: style (noConstructor): The class 'foo' does not have a constructor."
|
// ticket #4290 "False Positive: style (noConstructor): The class 'foo' does not have a constructor."
|
||||||
// ticket #3190 "SymbolDatabase: Parse of sub class constructor fails"
|
// ticket #3190 "SymbolDatabase: Parse of sub class constructor fails"
|
||||||
void forwardDeclaration() {
|
void forwardDeclaration() {
|
||||||
|
|
Loading…
Reference in New Issue