diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 7336abcc947..ee7dd165784 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -3718,7 +3718,7 @@ void Tokenizer::simplifyParenthesizedLibraryFunctions() if (!Token::simpleMatch(tok, ") (")) continue; Token *rpar = tok, *lpar = tok->link(); - if (!lpar) + if (!lpar || Token::Match(lpar->previous(), "%name%")) continue; const Token *ftok = rpar->previous(); if (mSettings.library.isNotLibraryFunction(ftok)) diff --git a/test/testio.cpp b/test/testio.cpp index 3ccf07858ad..df141f6e916 100644 --- a/test/testio.cpp +++ b/test/testio.cpp @@ -78,6 +78,7 @@ class TestIO : public TestFixture { TEST_CASE(testParameterPack); // #11289 TEST_CASE(testDefaultSignInt); // #13363 + TEST_CASE(testPrintfWithGeneric); // #13592 } struct CheckOptions @@ -4952,6 +4953,16 @@ class TestIO : public TestFixture { check(code, dinit(CheckOptions, $.defaultSign = 'u')); ASSERT_EQUALS("", errout_str()); } + + void testPrintfWithGeneric() { // #13592 + const char code[] = + "void f(void) {\n" + " float x = 27.0f;\n" + " printf(\"%s\\n\", _Generic(x, double: cbrt, float: cbrtf)(x));\n" + "}\n"; + check(code); + ASSERT_EQUALS("", errout_str()); + } }; REGISTER_TEST(TestIO)