[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