Changed Requires to Requirements.

Hi doug.gregor, djasper,

http://llvm-reviews.chandlerc.com/D2027

CHANGE SINCE LAST DIFF
  http://llvm-reviews.chandlerc.com/D2027?vs=5162&id=5204#toc

Files:
  include/clang/Parse/Parser.h
  test/Parser/pragma-weak.c
  test/CodeGen/pragma-weak.c

Index: include/clang/Parse/Parser.h
===================================================================
--- include/clang/Parse/Parser.h
+++ include/clang/Parse/Parser.h
@@ -1471,8 +1471,12 @@
   typedef SmallVector<ParsedType, 12> TypeVector;
 
   StmtResult ParseStatement(SourceLocation *TrailingElseLoc = 0) {
-    StmtVector Stmts;
-    return ParseStatementOrDeclaration(Stmts, true, TrailingElseLoc);
+    StmtResult Res;
+    do {
+      StmtVector Stmts;
+      Res = ParseStatementOrDeclaration(Stmts, true, TrailingElseLoc);
+    } while(!Res.isInvalid() && !Res.get());
+    return Res;
   }
   StmtResult ParseStatementOrDeclaration(StmtVector &Stmts,
                                          bool OnlyStatement,
Index: test/Parser/pragma-weak.c
===================================================================
--- test/Parser/pragma-weak.c
+++ test/Parser/pragma-weak.c
@@ -15,3 +15,30 @@
 extern int a;
 /* expected-warning {{extra tokens at end of '#pragma weak'}}*/ #pragma weak a 
b
 /* expected-warning {{extra tokens at end of '#pragma weak'}}*/ #pragma weak a 
= x c
+
+
+void pragma_is_not_a_statement(int x)
+{
+  int t;
+
+  {
+    if (x)
+#pragma weak t
+    else // expected-error {{expected expression}}
+#pragma weak t
+  }
+
+  switch (x) {
+    case 1:
+#pragma weak t
+  } // expected-error {{expected statement}}
+  switch(x) {
+    default:
+#pragma weak t
+  } // expected-error {{expected statement}}
+
+label:
+#pragma weak t
+} // expected-error {{expected statement}}
+
+
Index: test/CodeGen/pragma-weak.c
===================================================================
--- test/CodeGen/pragma-weak.c
+++ test/CodeGen/pragma-weak.c
@@ -149,7 +149,29 @@
 }
 // CHECK: declare extern_weak i32 @PR14046e()
 
+// Parse #pragma weak after a label or case statement
+extern int PR16705a(void);
+extern int PR16705b(void);
+extern int PR16705c(void);
+void PR16705f(int a) {
+  switch(a) {
+  case 1:
+#pragma weak PR16705a
+    PR16705a();
+  default:
+#pragma weak PR16705b
+    PR16705b();
+  }
+label:
+  #pragma weak PR16705c
+  PR16705c();
+}
 
+// CHECK: declare extern_weak i32 @PR16705a()
+// CHECK: declare extern_weak i32 @PR16705b()
+// CHECK: declare extern_weak i32 @PR16705c()
+
+
 ///////////// TODO: stuff that still doesn't work
 
 // due to the fact that disparate TopLevelDecls cannot affect each other
Index: include/clang/Parse/Parser.h
===================================================================
--- include/clang/Parse/Parser.h
+++ include/clang/Parse/Parser.h
@@ -1471,8 +1471,12 @@
   typedef SmallVector<ParsedType, 12> TypeVector;
 
   StmtResult ParseStatement(SourceLocation *TrailingElseLoc = 0) {
-    StmtVector Stmts;
-    return ParseStatementOrDeclaration(Stmts, true, TrailingElseLoc);
+    StmtResult Res;
+    do {
+      StmtVector Stmts;
+      Res = ParseStatementOrDeclaration(Stmts, true, TrailingElseLoc);
+    } while(!Res.isInvalid() && !Res.get());
+    return Res;
   }
   StmtResult ParseStatementOrDeclaration(StmtVector &Stmts,
                                          bool OnlyStatement,
Index: test/Parser/pragma-weak.c
===================================================================
--- test/Parser/pragma-weak.c
+++ test/Parser/pragma-weak.c
@@ -15,3 +15,30 @@
 extern int a;
 /* expected-warning {{extra tokens at end of '#pragma weak'}}*/ #pragma weak a b
 /* expected-warning {{extra tokens at end of '#pragma weak'}}*/ #pragma weak a = x c
+
+
+void pragma_is_not_a_statement(int x)
+{
+  int t;
+
+  {
+    if (x)
+#pragma weak t
+    else // expected-error {{expected expression}}
+#pragma weak t
+  }
+
+  switch (x) {
+    case 1:
+#pragma weak t
+  } // expected-error {{expected statement}}
+  switch(x) {
+    default:
+#pragma weak t
+  } // expected-error {{expected statement}}
+
+label:
+#pragma weak t
+} // expected-error {{expected statement}}
+
+
Index: test/CodeGen/pragma-weak.c
===================================================================
--- test/CodeGen/pragma-weak.c
+++ test/CodeGen/pragma-weak.c
@@ -149,7 +149,29 @@
 }
 // CHECK: declare extern_weak i32 @PR14046e()
 
+// Parse #pragma weak after a label or case statement
+extern int PR16705a(void);
+extern int PR16705b(void);
+extern int PR16705c(void);
+void PR16705f(int a) {
+  switch(a) {
+  case 1:
+#pragma weak PR16705a
+    PR16705a();
+  default:
+#pragma weak PR16705b
+    PR16705b();
+  }
+label:
+  #pragma weak PR16705c
+  PR16705c();
+}
 
+// CHECK: declare extern_weak i32 @PR16705a()
+// CHECK: declare extern_weak i32 @PR16705b()
+// CHECK: declare extern_weak i32 @PR16705c()
+
+
 ///////////// TODO: stuff that still doesn't work
 
 // due to the fact that disparate TopLevelDecls cannot affect each other
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to