ccing Alp.
On 13 January 2014 01:06, Serge Pavlov <[email protected]> wrote: > Any comments? > > > 2013/12/19 Serge Pavlov <[email protected]> >> >> sepavloff added you to the CC list for the revision "Fixed error recovery >> if sizeof is used without parenthesis". >> >> Changes made in r192200 fixed PR16992, which requested fixit suggesting >> parenthesis if sizeof is followed by type-id. However expression in form >> T() followed by ')' was incorrectly considered as a type-id if 'T' is >> typedef name. This change fixes this case. >> >> http://llvm-reviews.chandlerc.com/D2440 >> >> Files: >> include/clang/Parse/Parser.h >> lib/Parse/ParseExpr.cpp >> lib/Parse/ParseTentative.cpp >> test/SemaCXX/expressions.cpp >> >> Index: include/clang/Parse/Parser.h >> =================================================================== >> --- include/clang/Parse/Parser.h >> +++ include/clang/Parse/Parser.h >> @@ -1772,6 +1772,7 @@ >> /// disambiguation will occur. >> enum TentativeCXXTypeIdContext { >> TypeIdInParens, >> + TypeIdSeparate, >> TypeIdAsTemplateArgument >> }; >> >> @@ -1790,6 +1791,16 @@ >> return isTypeIdInParens(isAmbiguous); >> } >> >> + /// \brief Checks if the current tokens form type-id or expression. >> + /// It is similar to isTypeIdInParens but does not suppose that type-id >> + /// is in parenthesis. >> + bool isTypeIdSeparate(bool &isAmbiguous) { >> + if (getLangOpts().CPlusPlus) >> + return isCXXTypeId(TypeIdSeparate, isAmbiguous); >> + isAmbiguous = false; >> + return isTypeSpecifierQualifier(); >> + } >> + >> /// isCXXDeclarationStatement - C++-specialized function that >> disambiguates >> /// between a declaration or an expression statement, when parsing >> function >> /// bodies. Returns true for declaration, false for expression. >> Index: lib/Parse/ParseExpr.cpp >> =================================================================== >> --- lib/Parse/ParseExpr.cpp >> +++ lib/Parse/ParseExpr.cpp >> @@ -1493,7 +1493,7 @@ >> if (OpTok.is(tok::kw_sizeof) || OpTok.is(tok::kw___alignof) || >> OpTok.is(tok::kw_alignof) || OpTok.is(tok::kw__Alignof)) { >> bool isAmbiguousTypeId; >> - if (isTypeIdInParens(isAmbiguousTypeId)) { >> + if (isTypeIdSeparate(isAmbiguousTypeId)) { >> DeclSpec DS(AttrFactory); >> ParseSpecifierQualifierList(DS); >> Declarator DeclaratorInfo(DS, Declarator::TypeNameContext); >> Index: lib/Parse/ParseTentative.cpp >> =================================================================== >> --- lib/Parse/ParseTentative.cpp >> +++ lib/Parse/ParseTentative.cpp >> @@ -437,9 +437,12 @@ >> TPR = TPResult::True(); >> >> if (TPR == TPResult::Ambiguous()) { >> + if (Context == TypeIdSeparate) >> + TPR = TPResult::False(); >> + >> // We are supposed to be inside parens, so if after the abstract >> declarator >> // we encounter a ')' this is a type-id, otherwise it's an >> expression. >> - if (Context == TypeIdInParens && Tok.is(tok::r_paren)) { >> + else if (Context == TypeIdInParens && Tok.is(tok::r_paren)) { >> TPR = TPResult::True(); >> isAmbiguous = true; >> >> Index: test/SemaCXX/expressions.cpp >> =================================================================== >> --- test/SemaCXX/expressions.cpp >> +++ test/SemaCXX/expressions.cpp >> @@ -118,3 +118,10 @@ >> (void)s1.foo(); >> (void)s2.foo(); >> } >> + >> +namespace pr16992 { >> + typedef int T; >> + unsigned getsz() { >> + return (sizeof T()); >> + } >> +} >> >> _______________________________________________ >> cfe-commits mailing list >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >> > > > > -- > Thanks, > --Serge > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
