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