Ticket #8632: Parenthesize ternary operator operands containing < to avoid wrongly thinking a template instantiation is met. (#1389)

This commit is contained in:
Simon Martin 2018-09-23 10:27:38 +02:00 committed by Daniel Marjamäki
parent f965e5873d
commit 6bde2445a6
3 changed files with 5 additions and 1 deletions

View File

@ -10162,6 +10162,8 @@ void Tokenizer::prepareTernaryOpForAST()
break;
else if (tok2->str() == ",")
parenthesesNeeded = true;
else if (tok2->str() == "<")
parenthesesNeeded = true;
else if (tok2->str() == "?") {
depth++;
parenthesesNeeded = true;

View File

@ -1138,7 +1138,7 @@ private:
"template <class T, unsigned S> class C3 {};\n"
"template <class T, unsigned S> C3<T, S>::C3(const C3<T, S> &v) { C1<T *> c1; }\n"
"C3<int,6> c3;";
const char exp[] = "template < class T > void f ( ) { x = y ? C1 < int > :: allocate ( 1 ) : 0 ; } "
const char exp[] = "template < class T > void f ( ) { x = y ? ( C1 < int > :: allocate ( 1 ) ) : 0 ; } "
"C3<int,6> c3 ; "
"class C3<int,6> { } ; "
"C3<int,6> :: C3<int,6> ( const C3<int,6> & v ) { C1<int*> c1 ; } "

View File

@ -8110,6 +8110,8 @@ private:
ASSERT_EQUALS("a ? ( 1 ? ( a , b ) : 3 ) : d ;", tokenizeAndStringify("a ? 1 ? a, b : 3 : d;"));
ASSERT_EQUALS("a ? ( std :: map < int , int > ( ) ) : 0 ;", tokenizeAndStringify("typedef std::map<int,int> mymap; a ? mymap() : 0;"));
ASSERT_EQUALS("a ? ( b < c ) : d > e", tokenizeAndStringify("a ? b < c : d > e"));
}
std::string testAst(const char code[],bool verbose=false) {