Implement the first set of changes for PR3963 and rdar://6759604,
which tries to do better error recovery when it is "obvious" that an
identifier is a mis-typed typename.  In this case, we try to parse
it as a typename instead of as the identifier in a declarator, which
gives us several options for better error recovery and immediately
makes diagnostics more useful.  For example, we now produce:

t.c:4:8: error: unknown type name 'foo_t'
static foo_t a = 4;
       ^

instead of:

t.c:4:14: error: invalid token after top level declarator
static foo_t a = 4;
             ^

Also, since we now parse "a" correctly, we make a decl for it,
preventing later uses of 'a' from emitting things like:

t.c:12:20: error: use of undeclared identifier 'a'
int bar() { return a + b; }
                   ^

I'd really appreciate any scrutiny possible on this, it 
is a tricky area.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68911 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/test/Lexer/block_cmt_end.c b/test/Lexer/block_cmt_end.c
index 65d948f..d85cf81 100644
--- a/test/Lexer/block_cmt_end.c
+++ b/test/Lexer/block_cmt_end.c
@@ -17,7 +17,7 @@
 /* expected-warning {{escaped newline}} expected-warning {{backslash and newline}}  *\  
 /
 
-bar
+int bar
 
 /* xyz
 
diff --git a/test/Parser/declarators.c b/test/Parser/declarators.c
index 8a533ee..09b43e5 100644
--- a/test/Parser/declarators.c
+++ b/test/Parser/declarators.c
@@ -12,7 +12,7 @@
 
 void (*signal(int, void (*)(int)))(int);
 
-int a, ***C, * const D, b(int);
+int a, ***C, * const D, B(int);
 
 int *A;
 
@@ -36,3 +36,20 @@
 // PR3031
 int (test5), ;  // expected-error {{expected identifier or '('}}
 
+
+
+// PR3963 & rdar://6759604 - test error recovery for mistyped "typenames".
+
+struct xyz { int y; };
+
+foo_t a = 4;   // expected-error {{unknown type name 'foo_t'}}
+xyz b;         // expected-error {{unknown type name 'xyz'}}
+
+foo_t *d;      // expected-error {{unknown type name 'foo_t'}}
+
+static f;      // expected-warning {{type specifier missing, defaults to 'int'}}
+static g = 4;  // expected-warning {{type specifier missing, defaults to 'int'}}
+static h        // expected-warning {{type specifier missing, defaults to 'int'}} 
+      __asm__("foo"); // expected-warning {{extension used}}
+
+int bar() { return a; }
diff --git a/test/Parser/objc-foreach-syntax.m b/test/Parser/objc-foreach-syntax.m
index e6e3ccf..977dccc 100644
--- a/test/Parser/objc-foreach-syntax.m
+++ b/test/Parser/objc-foreach-syntax.m
@@ -1,10 +1,8 @@
 // RUN: clang-cc -fsyntax-only -verify %s
 
-ce MyList // expected-error {{invalid token after top level declarator}}
-@end
 
 
-@implementation MyList
+@implementation MyList // expected-warning {{cannot find interface declaration for 'MyList'}}
 - (unsigned int)countByEnumeratingWithState:  (struct __objcFastEnumerationState *)state objects:  (id *)items count:(unsigned int)stackcount
 {
      return 0;
@@ -14,10 +12,10 @@
 
 int LOOP();
 
-@implementation MyList (BasicTest)  // expected-error {{cannot find interface declaration for 'MyList'}}
+@implementation MyList (BasicTest) 
 - (void)compilerTestAgainst {
-MyList * el;  // expected-error {{use of undeclared identifier 'MyList'}}
-     for (el in @"foo")    // expected-error {{use of undeclared identifier 'el'}}
+MyList * el; 
+     for (el in @"foo") 
 	  { LOOP(); }
 }
 @end
diff --git a/test/SemaObjC/exception-go-boom.m b/test/SemaObjC/exception-go-boom.m
index 1d792c4..774ae7c 100644
--- a/test/SemaObjC/exception-go-boom.m
+++ b/test/SemaObjC/exception-go-boom.m
@@ -4,7 +4,7 @@
 void f0(id x) {
   @try {
   } @catch (NSException *x) { // \
-         expected-warning{{type specifier missing, defaults to 'int'}} \
+         expected-error{{unknown type name 'NSException'}} \
          expected-error{{@catch parameter is not a pointer to an interface type}}
   }
 }