Fixed #9860 (wrong ast for placement new 'new ( uBAR ? uBAR : sizeof ( T ) ) T')

This commit is contained in:
Daniel Marjamäki 2020-11-23 22:03:50 +01:00
parent 1fcc5c233d
commit b4db52bf61
2 changed files with 19 additions and 5 deletions

View File

@ -1045,9 +1045,14 @@ static void compilePrecedence3(Token *&tok, AST_state& state)
if (tok->str() == "(") { if (tok->str() == "(") {
if (Token::Match(tok, "( &| %name%") && Token::Match(tok->link(), ") ( %type%") && Token::simpleMatch(tok->link()->linkAt(1), ") (")) if (Token::Match(tok, "( &| %name%") && Token::Match(tok->link(), ") ( %type%") && Token::simpleMatch(tok->link()->linkAt(1), ") ("))
tok = tok->link()->next(); tok = tok->link()->next();
if (Token::Match(tok->link(), ") ::| %type%")) if (Token::Match(tok->link(), ") ::| %type%")) {
if (Token::Match(tok, "( !!)")) {
Token *innerTok = tok->next();
AST_state innerState(true);
compileExpression(innerTok, innerState);
}
tok = tok->link()->next(); tok = tok->link()->next();
else if (Token::Match(tok, "( %type%") && Token::Match(tok->link(), ") [();,[]")) { } else if (Token::Match(tok, "( %type%") && Token::Match(tok->link(), ") [();,[]")) {
tok = tok->next(); tok = tok->next();
innertype = true; innertype = true;
} else if (Token::Match(tok, "( &| %name%") && Token::simpleMatch(tok->link(), ") (")) { } else if (Token::Match(tok, "( &| %name%") && Token::simpleMatch(tok->link(), ") (")) {

View File

@ -1065,7 +1065,13 @@ private:
ASSERT_EQUALS(";", tokenizeAndStringify(code, s)); ASSERT_EQUALS(";", tokenizeAndStringify(code, s));
s.checkUnusedTemplates = true; s.checkUnusedTemplates = true;
ASSERT_THROW(tokenizeAndStringify(code, s), InternalError); ASSERT_EQUALS("; template < typename T , u_int uBAR = 0 >\n"
"class Foo {\n"
"public:\n"
"void FooBar ( ) {\n"
"new ( uBAR ? uBAR : sizeof ( T ) ) T ;\n"
"}\n"
"} ;", tokenizeAndStringify(code, s));
} }
// Dont remove "(int *)".. // Dont remove "(int *)"..
@ -7752,18 +7758,21 @@ private:
ASSERT_EQUALS("aFoobar(new=", testAst("a = new Foo(bar);")); ASSERT_EQUALS("aFoobar(new=", testAst("a = new Foo(bar);"));
ASSERT_EQUALS("aFoobar(new=", testAst("a = new Foo(bar);")); ASSERT_EQUALS("aFoobar(new=", testAst("a = new Foo(bar);"));
ASSERT_EQUALS("aFoo(new=", testAst("a = new Foo<bar>();")); ASSERT_EQUALS("aFoo(new=", testAst("a = new Foo<bar>();"));
ASSERT_EQUALS("X12,3,(new", testAst("new (a,b,c) X(1,2,3);"));
ASSERT_EQUALS("aXnew(", testAst("a (new (X));")); ASSERT_EQUALS("aXnew(", testAst("a (new (X));"));
ASSERT_EQUALS("aXnew5,(", testAst("a (new (X), 5);")); ASSERT_EQUALS("aXnew5,(", testAst("a (new (X), 5);"));
ASSERT_EQUALS("adelete", testAst("delete a;")); ASSERT_EQUALS("adelete", testAst("delete a;"));
ASSERT_EQUALS("adelete", testAst("delete (a);")); ASSERT_EQUALS("adelete", testAst("delete (a);"));
ASSERT_EQUALS("adelete", testAst("delete[] a;")); ASSERT_EQUALS("adelete", testAst("delete[] a;"));
ASSERT_EQUALS("ab.3c-(delete", testAst("delete[] a.b(3 - c);")); ASSERT_EQUALS("ab.3c-(delete", testAst("delete[] a.b(3 - c);"));
ASSERT_EQUALS("a::new=", testAst("a = new (b) ::X;"));
ASSERT_EQUALS("aA1(new(bB2(new(,", testAst("a(new A(1)), b(new B(2))")); ASSERT_EQUALS("aA1(new(bB2(new(,", testAst("a(new A(1)), b(new B(2))"));
ASSERT_EQUALS("Fred10[new", testAst(";new Fred[10];")); ASSERT_EQUALS("Fred10[new", testAst(";new Fred[10];"));
ASSERT_EQUALS("adelete", testAst("void f() { delete a; }")); ASSERT_EQUALS("adelete", testAst("void f() { delete a; }"));
// placement new
ASSERT_EQUALS("X12,3,(new ab,c,", testAst("new (a,b,c) X(1,2,3);"));
ASSERT_EQUALS("a::new=", testAst("a = new (b) ::X;"));
ASSERT_EQUALS("cCnew= abc:?", testAst("c = new(a ? b : c) C;"));
// invalid code (libreoffice), don't hang // invalid code (libreoffice), don't hang
// #define SlideSorterViewShell // #define SlideSorterViewShell
// SfxViewFrame* pFrame; // SfxViewFrame* pFrame;