Fixed #6930 (Token: need function that says if the token comes from instantiated template argument)

This commit is contained in:
Daniel Marjamäki 2018-01-11 09:41:22 +01:00
parent 323e9ab509
commit bbeff99cc3
4 changed files with 19 additions and 1 deletions

View File

@ -152,7 +152,7 @@ bool isSameExpression(bool cpp, bool macro, const Token *tok1, const Token *tok2
} }
return false; return false;
} }
if (macro && (tok1->isExpandedMacro() || tok2->isExpandedMacro())) if (macro && (tok1->isExpandedMacro() || tok2->isExpandedMacro() || tok1->isTemplateArg() || tok2->isTemplateArg()))
return false; return false;
if (tok1->isComplex() != tok2->isComplex()) if (tok1->isComplex() != tok2->isComplex())
return false; return false;

View File

@ -1034,6 +1034,7 @@ void TemplateSimplifier::expandTemplate(
else if (typeindentlevel > 0 && typetok->str() == ">") else if (typeindentlevel > 0 && typetok->str() == ">")
--typeindentlevel; --typeindentlevel;
tokenlist.addtoken(typetok, tok3->linenr(), tok3->fileIndex()); tokenlist.addtoken(typetok, tok3->linenr(), tok3->fileIndex());
tokenlist.back()->isTemplateArg(true);
} }
continue; continue;
} }

View File

@ -422,6 +422,12 @@ public:
void isEnumType(bool value) { void isEnumType(bool value) {
setFlag(fIsEnumType, value); setFlag(fIsEnumType, value);
} }
bool isTemplateArg() const {
return getFlag(fIsTemplateArg);
}
void isTemplateArg(bool value) {
setFlag(fIsTemplateArg, value);
}
static const Token *findsimplematch(const Token * const startTok, const char pattern[]); static const Token *findsimplematch(const Token * const startTok, const char pattern[]);
static const Token *findsimplematch(const Token * const startTok, const char pattern[], const Token * const end); static const Token *findsimplematch(const Token * const startTok, const char pattern[], const Token * const end);
@ -898,6 +904,7 @@ private:
fIsEnumType = (1 << 19), // enumeration type fIsEnumType = (1 << 19), // enumeration type
fIsName = (1 << 20), fIsName = (1 << 20),
fIsLiteral = (1 << 21), fIsLiteral = (1 << 21),
fIsTemplateArg = (1 << 22),
}; };
unsigned int _flags; unsigned int _flags;

View File

@ -129,6 +129,7 @@ private:
TEST_CASE(duplicateExpression5); // ticket #3749 (macros with same values) TEST_CASE(duplicateExpression5); // ticket #3749 (macros with same values)
TEST_CASE(duplicateExpression6); // ticket #4639 TEST_CASE(duplicateExpression6); // ticket #4639
TEST_CASE(duplicateExpressionTernary); // #6391 TEST_CASE(duplicateExpressionTernary); // #6391
TEST_CASE(duplicateExpressionTemplate); // #6930
TEST_CASE(checkSignOfUnsignedVariable); TEST_CASE(checkSignOfUnsignedVariable);
TEST_CASE(checkSignOfPointer); TEST_CASE(checkSignOfPointer);
@ -3875,6 +3876,15 @@ private:
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
} }
void duplicateExpressionTemplate() { // #6930
check("template <int I> void f() {\n"
" if (I >= 0 && I < 3) {}\n"
"}\n"
"\n"
"static auto a = f<0>();");
ASSERT_EQUALS("", errout.str());
}
void checkSignOfUnsignedVariable() { void checkSignOfUnsignedVariable() {
check( check(
"void foo() {\n" "void foo() {\n"