From a3f5beb75d3baa865a758da7e39c7bbc197a6ea2 Mon Sep 17 00:00:00 2001 From: PKEuS Date: Tue, 18 Mar 2014 16:22:00 +0100 Subject: [PATCH] Fixed problems with code "enum class { };" (which is valid C) --- lib/tokenize.cpp | 6 +++--- test/testsimplifytokens.cpp | 12 ++++++++++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index a5ec03abc..682c943aa 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -7355,8 +7355,8 @@ void Tokenizer::simplifyEnum() Token *typeTokenStart = nullptr; Token *typeTokenEnd = nullptr; - // check for C++0x enum class - bool enumClass = Token::Match(tok->next(), "class|struct"); + // check for C++11 enum class + bool enumClass = isCPP() && Token::Match(tok->next(), "class|struct"); if (enumClass) tok->deleteNext(); @@ -7522,7 +7522,7 @@ void Tokenizer::simplifyEnum() std::string pattern; if (!className.empty()) pattern += className + " :: "; - if (enumClass) + if (enumClass && enumType) pattern += enumType->str() + " :: "; int level = 0; diff --git a/test/testsimplifytokens.cpp b/test/testsimplifytokens.cpp index e6860f32d..5cf74a1d5 100644 --- a/test/testsimplifytokens.cpp +++ b/test/testsimplifytokens.cpp @@ -6736,14 +6736,14 @@ private: } // Check simplifyEnum - std::string checkSimplifyEnum(const char code[]) { + std::string checkSimplifyEnum(const char code[], bool cpp = true) { errout.str(""); // Tokenize.. Settings settings; settings.addEnabled("style"); Tokenizer tokenizer(&settings, this); std::istringstream istr(code); - tokenizer.tokenize(istr, "test.cpp"); + tokenizer.tokenize(istr, cpp?"test.cpp":"test.c"); return tokenizer.tokens()->stringifyList(0, true); } @@ -6907,6 +6907,14 @@ private: const char expected[] = "unsigned long long e1 ; e1 = 0 ;"; ASSERT_EQUALS(expected, checkSimplifyEnum(code)); } + + { + const char code[] = "enum class { A };\n" + "int i = A;"; + const char expected [] = "int i ; i = 0 ;"; + ASSERT_EQUALS(expected, checkSimplifyEnum(code, false)); // Compile as C code: enum has name 'class' + checkSimplifyEnum(code, true); // Compile as C++ code: Don't crash + } } void enum16() { // ticket #1988