fix #10335 (Type alias remains unknown with using) (#3323)

Co-authored-by: Robert Reif <reif@FX6840>
This commit is contained in:
Robert Reif 2021-07-02 00:19:26 -04:00 committed by GitHub
parent 5426ac6a22
commit 68898e2be0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 6 deletions

View File

@ -2368,7 +2368,15 @@ bool Tokenizer::simplifyUsing()
std::string scope1 = currentScope1->fullName; std::string scope1 = currentScope1->fullName;
bool skip = false; // don't erase type aliases we can't parse bool skip = false; // don't erase type aliases we can't parse
Token *enumOpenBrace = nullptr;
for (Token* tok1 = startToken; !skip && tok1 && tok1 != endToken; tok1 = tok1->next()) { for (Token* tok1 = startToken; !skip && tok1 && tok1 != endToken; tok1 = tok1->next()) {
// skip enum body
if (tok1 && tok1 == enumOpenBrace) {
tok1 = tok1->link();
enumOpenBrace = nullptr;
continue;
}
if ((Token::Match(tok1, "{|}|namespace|class|struct|union") && tok1->strAt(-1) != "using") || if ((Token::Match(tok1, "{|}|namespace|class|struct|union") && tok1->strAt(-1) != "using") ||
Token::Match(tok1, "using namespace %name% ;|::")) { Token::Match(tok1, "using namespace %name% ;|::")) {
setScopeInfo(tok1, &currentScope1); setScopeInfo(tok1, &currentScope1);
@ -2389,12 +2397,15 @@ bool Tokenizer::simplifyUsing()
continue; continue;
} }
// skip enum definitions // check for enum with body
if (tok1->str() == "enum") if (tok1->str() == "enum") {
skipEnumBody(&tok1); Token *defStart = tok1;
while (Token::Match(defStart, "%name%|::|:"))
if (!tok1) defStart = defStart->next();
break; if (Token::simpleMatch(defStart, "{"))
enumOpenBrace = defStart;
continue;
}
// check for member function and adjust scope // check for member function and adjust scope
if (isMemberFunction(tok1)) { if (isMemberFunction(tok1)) {

View File

@ -90,6 +90,7 @@ private:
TEST_CASE(simplifyUsing10171); TEST_CASE(simplifyUsing10171);
TEST_CASE(simplifyUsing10172); TEST_CASE(simplifyUsing10172);
TEST_CASE(simplifyUsing10173); TEST_CASE(simplifyUsing10173);
TEST_CASE(simplifyUsing10335);
} }
std::string tok(const char code[], bool simplify = true, Settings::PlatformType type = Settings::Native, bool debugwarnings = true) { std::string tok(const char code[], bool simplify = true, Settings::PlatformType type = Settings::Native, bool debugwarnings = true) {
@ -1304,6 +1305,13 @@ private:
ASSERT_EQUALS(exp, tok(code, true)); ASSERT_EQUALS(exp, tok(code, true));
} }
} }
void simplifyUsing10335() {
const char code[] = "using uint8_t = unsigned char;\n"
"enum E : uint8_t { E0 };";
const char exp[] = "enum E : unsigned char { E0 } ;";
ASSERT_EQUALS(exp, tok(code, false));
}
}; };
REGISTER_TEST(TestSimplifyUsing) REGISTER_TEST(TestSimplifyUsing)