[cfe-commits] r46942 - in /cfe/trunk: Sema/SemaDecl.cpp test/Sema/invalid-struct-init.c

Steve Naroff snaroff at apple.com
Sun Feb 10 16:06:17 PST 2008


Author: snaroff
Date: Sun Feb 10 18:06:17 2008
New Revision: 46942

URL: http://llvm.org/viewvc/llvm-project?rev=46942&view=rev
Log:

Fix http://llvm.org/bugs/show_bug.cgi?id=1988.

Sema::CheckInitializerListTypes() needs to ignore invalid structures.


Added:
    cfe/trunk/test/Sema/invalid-struct-init.c
Modified:
    cfe/trunk/Sema/SemaDecl.cpp

Modified: cfe/trunk/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Sema/SemaDecl.cpp?rev=46942&r1=46941&r2=46942&view=diff

==============================================================================
--- cfe/trunk/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/Sema/SemaDecl.cpp Sun Feb 10 18:06:17 2008
@@ -526,6 +526,11 @@
         ++startIndex;
       } else {
         RecordDecl* structDecl = DeclType->getAsRecordType()->getDecl();
+        
+        // If the record is invalid, it's members can't be trusted. 
+        if (structDecl->isInvalidDecl())
+          return true;
+          
         // If structDecl is a forward declaration, this loop won't do anything;
         // That's okay, because an error should get printed out elsewhere. It
         // might be worthwhile to skip over the rest of the initializer, though.

Added: cfe/trunk/test/Sema/invalid-struct-init.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/invalid-struct-init.c?rev=46942&view=auto

==============================================================================
--- cfe/trunk/test/Sema/invalid-struct-init.c (added)
+++ cfe/trunk/test/Sema/invalid-struct-init.c Sun Feb 10 18:06:17 2008
@@ -0,0 +1,27 @@
+// RUN: clang %s -verify -fsyntax-only
+
+typedef struct _zend_module_entry zend_module_entry;
+struct _zend_module_entry {
+  _efree((p)); // expected-error{{type name requires a specifier or qualifier}} \
+               // expected-error{{type specifier required for parameter 'p'}} \
+               // expected-error{{field '_efree' declared as a function}}
+};
+typedef struct _zend_function_entry { } zend_function_entry;
+typedef struct _zend_pcre_globals { } zend_pcre_globals;
+zend_pcre_globals pcre_globals;
+
+static void zm_globals_ctor_pcre(zend_pcre_globals *pcre_globals ) { }
+static void zm_globals_dtor_pcre(zend_pcre_globals *pcre_globals ) { }
+static void zm_info_pcre(zend_module_entry *zend_module ) { }
+static int zm_startup_pcre(int type, int module_number ) { }
+
+static int zm_shutdown_pcre(int type, int module_number ) {
+  zend_function_entry pcre_functions[] = {{ }; // expected-error{{expected '}'}} expected-error{{to match this '{'}}
+  zend_module_entry pcre_module_entry = {
+    sizeof(zend_module_entry), 20071006, 0, 0, ((void *)0), ((void *)0),    
+    "pcre",  pcre_functions,  zm_startup_pcre,  zm_shutdown_pcre,  ((void *)0),  
+    ((void *)0),  zm_info_pcre,  ((void *)0),  sizeof(zend_pcre_globals), &pcre_globals,  
+    ((void (*)(void* ))(zm_globals_ctor_pcre)),  ((void (*)(void* ))(zm_globals_dtor_pcre)),  
+    ((void *)0),  0, 0, ((void *)0), 0 
+  };
+}





More information about the cfe-commits mailing list