[cfe-commits] r156464 - in /cfe/trunk: lib/Sema/SemaChecking.cpp test/Sema/array-bounds-ptr-arith.c

Ted Kremenek kremenek at apple.com
Tue May 8 22:35:08 PDT 2012


Author: kremenek
Date: Wed May  9 00:35:08 2012
New Revision: 156464

URL: http://llvm.org/viewvc/llvm-project?rev=156464&view=rev
Log:
Teach IsTailPaddedMemberArray() (used by -Warray-bounds) that a FieldDecl may have a Typedef type, and not always a ConstantArrayType.

Fixes <rdar://problem/11387038>.

Modified:
    cfe/trunk/lib/Sema/SemaChecking.cpp
    cfe/trunk/test/Sema/array-bounds-ptr-arith.c

Modified: cfe/trunk/lib/Sema/SemaChecking.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=156464&r1=156463&r2=156464&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaChecking.cpp (original)
+++ cfe/trunk/lib/Sema/SemaChecking.cpp Wed May  9 00:35:08 2012
@@ -4590,12 +4590,20 @@
   // substitution to form C89 tail-padded arrays.
 
   TypeSourceInfo *TInfo = FD->getTypeSourceInfo();
-  if (TInfo) {
-    ConstantArrayTypeLoc TL =
-      cast<ConstantArrayTypeLoc>(TInfo->getTypeLoc());
-    const Expr *SizeExpr = dyn_cast<IntegerLiteral>(TL.getSizeExpr());
+  while (TInfo) {
+    TypeLoc TL = TInfo->getTypeLoc();
+    // Look through typedefs.
+    const TypedefTypeLoc *TTL = dyn_cast<TypedefTypeLoc>(&TL);
+    if (TTL) {
+      const TypedefNameDecl *TDL = TTL->getTypedefNameDecl();
+      TInfo = TDL->getTypeSourceInfo();
+      continue;
+    }
+    ConstantArrayTypeLoc CTL = cast<ConstantArrayTypeLoc>(TL);
+    const Expr *SizeExpr = dyn_cast<IntegerLiteral>(CTL.getSizeExpr());
     if (!SizeExpr || SizeExpr->getExprLoc().isMacroID())
       return false;
+    break;
   }
 
   const RecordDecl *RD = dyn_cast<RecordDecl>(FD->getDeclContext());

Modified: cfe/trunk/test/Sema/array-bounds-ptr-arith.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/array-bounds-ptr-arith.c?rev=156464&r1=156463&r2=156464&view=diff
==============================================================================
--- cfe/trunk/test/Sema/array-bounds-ptr-arith.c (original)
+++ cfe/trunk/test/Sema/array-bounds-ptr-arith.c Wed May  9 00:35:08 2012
@@ -19,3 +19,21 @@
   int a[10];
   int *p = a - s->n;
 }
+
+// Test case reduced from <rdar://problem/11387038>.  This resulted in
+// an assertion failure because of the typedef instead of an explicit
+// constant array type.
+struct RDar11387038 {};
+typedef struct RDar11387038 RDar11387038Array[1];
+struct RDar11387038_Table {
+  RDar11387038Array z;
+};
+typedef struct RDar11387038_Table * TPtr;
+typedef TPtr *TabHandle;
+struct RDar11387038_B { TabHandle x; };
+typedef struct RDar11387038_B RDar11387038_B;
+
+void radar11387038() {
+  RDar11387038_B *pRDar11387038_B;
+  struct RDar11387038* y = &(*pRDar11387038_B->x)->z[4];
+}





More information about the cfe-commits mailing list