]> granicus.if.org Git - clang/commitdiff
Get rid of an early return in Sema::ActOnFields which doesn't make sense anymore.
authorEli Friedman <eli.friedman@gmail.com>
Wed, 8 Aug 2012 04:39:56 +0000 (04:39 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Wed, 8 Aug 2012 04:39:56 +0000 (04:39 +0000)
Fixes a crash (<rdar://problem/11067144>), and generally seems to improve
recovery in other cases.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@161474 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDecl.cpp
test/Sema/invalid-decl.c
test/SemaCXX/PR9460.cpp
test/SemaCXX/constructor-initializer.cpp

index ffe45fad0393a6851be75e52eac0227d9bacbd8a..869fedb00c2aa9b9e260bd6fba28544c89ecb9a1 100644 (file)
@@ -9751,11 +9751,6 @@ void Sema::ActOnFields(Scope* S,
                        AttributeList *Attr) {
   assert(EnclosingDecl && "missing record or interface decl");
 
-  // If the decl this is being inserted into is invalid, then it may be a
-  // redeclaration or some other bogus case.  Don't try to add fields to it.
-  if (EnclosingDecl->isInvalidDecl())
-    return;
-
   // If this is an Objective-C @implementation or category and we have
   // new fields here we should reset the layout of the interface since
   // it will now change.
index a5e7ad3b1ec1dd62dd611add9437cd88496a6ce3..2699b254926ac8abfa184e738cfc3f0da1fa599b 100644 (file)
@@ -20,3 +20,12 @@ zend_module_entry openssl_module_entry = {
     sizeof(zend_module_entry)
 };
 
+// <rdar://problem/11067144>
+typedef int (FunctionType)(int *value);
+typedef struct {
+  UndefinedType undef; // expected-error {{unknown type name 'UndefinedType'}}
+  FunctionType fun; // expected-error {{field 'fun' declared as a function}}
+} StructType;
+void f(StructType *buf) {
+  buf->fun = 0;
+}
index 5b8b7b2cf68f4b11f5934c0892d37ab34b9d8b75..0dd844677053bff9520d01d9b5bb4a3a908805e0 100644 (file)
@@ -8,11 +8,11 @@ struct basic_string{
   basic_string(aT*);
 };
 
-struct runtime_error{ // expected-note{{candidate constructor}}
-  runtime_error( // expected-note{{candidate constructor}}
+struct runtime_error{
+  runtime_error(
 basic_string<char> struct{ // expected-error {{cannot combine with previous 'type-name' declaration specifier}}
 a(){ // expected-error {{requires a type specifier}}
-  runtime_error(0); // expected-error{{no matching conversion for functional-style cast from 'int' to 'runtime_error'}}
+  runtime_error(0);
 }
 }
 );
index 1a4e54444f42e6d7d8c7b50bb4811ddb9944303a..f503d01f360d3b9b989d8b6d623032b18df1a19c 100644 (file)
@@ -232,13 +232,13 @@ namespace PR7402 {
 // <rdar://problem/8308215>: don't crash.
 // Lots of questionable recovery here;  errors can change.
 namespace test3 {
-  class A : public std::exception {}; // expected-error {{undeclared identifier}} expected-error {{expected class name}} expected-note 3 {{candidate}} expected-note {{passing argument}}
+  class A : public std::exception {}; // expected-error {{undeclared identifier}} expected-error {{expected class name}} expected-note 2 {{candidate}}
   class B : public A {
   public:
     B(const String& s, int e=0) // expected-error {{unknown type name}} 
       : A(e), m_String(s) , m_ErrorStr(__null) {} // expected-error {{no matching constructor}} expected-error {{does not name}}
     B(const B& e)
-      : A(e), m_String(e.m_String), m_ErrorStr(__null) { // expected-error {{no viable conversion}} expected-error {{does not name}}
+      : A(e), m_String(e.m_String), m_ErrorStr(__null) { // expected-error {{does not name}} expected-error {{no member named 'm_String' in 'test3::B'}}
     }
   };
 }