[PATCH] Fixed error recovery if sizeof is used without parenthesis
Serge Pavlov
sepavloff at gmail.com
Thu Dec 19 02:34:23 PST 2013
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());
+ }
+}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D2440.1.patch
Type: text/x-patch
Size: 2618 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20131219/02aff6d5/attachment.bin>
More information about the cfe-commits
mailing list