aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2012-10-09 22:46:54 +0000
committerEli Friedman <eli.friedman@gmail.com>2012-10-09 22:46:54 +0000
commit8b2bfdda35de8239df0ff4a588214d5876a38d28 (patch)
tree9f713006697d09030c7bdca98ec9325358982baa
parent6c2fd0d71406c5f311ff00208448a63fa9071453 (diff)
People put pragmas in crazy places; add more handling. PR14046.
I think our general framework for parser pragmas needs a bit more work, but I'm not planning on working on it at the moment. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@165558 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Parse/ParseStmt.cpp20
-rw-r--r--test/CodeGen/pragma-weak.c9
2 files changed, 29 insertions, 0 deletions
diff --git a/lib/Parse/ParseStmt.cpp b/lib/Parse/ParseStmt.cpp
index 635f61b821..d008b037b0 100644
--- a/lib/Parse/ParseStmt.cpp
+++ b/lib/Parse/ParseStmt.cpp
@@ -254,11 +254,31 @@ Retry:
HandlePragmaPack();
return StmtEmpty();
+ case tok::annot_pragma_msstruct:
+ ProhibitAttributes(Attrs);
+ HandlePragmaMSStruct();
+ return StmtEmpty();
+
case tok::annot_pragma_align:
ProhibitAttributes(Attrs);
HandlePragmaAlign();
return StmtEmpty();
+ case tok::annot_pragma_weak:
+ ProhibitAttributes(Attrs);
+ HandlePragmaWeak();
+ return StmtEmpty();
+
+ case tok::annot_pragma_weakalias:
+ ProhibitAttributes(Attrs);
+ HandlePragmaWeakAlias();
+ return StmtEmpty();
+
+ case tok::annot_pragma_redefine_extname:
+ ProhibitAttributes(Attrs);
+ HandlePragmaRedefineExtname();
+ return StmtEmpty();
+
case tok::annot_pragma_fp_contract:
ProhibitAttributes(Attrs);
HandlePragmaFPContract();
diff --git a/test/CodeGen/pragma-weak.c b/test/CodeGen/pragma-weak.c
index 7ad2b77d8e..2efc2ebc28 100644
--- a/test/CodeGen/pragma-weak.c
+++ b/test/CodeGen/pragma-weak.c
@@ -157,6 +157,15 @@ void PR10878() { SHA384Pad(0); }
// CHECK: call void @SHA384Pad(i8* null)
+// PR14046: Parse #pragma weak in function-local context
+extern int PR14046e(void);
+void PR14046f() {
+#pragma weak PR14046e
+ PR14046e();
+}
+// CHECK: declare extern_weak i32 @PR14046e()
+
+
///////////// TODO: stuff that still doesn't work
// due to the fact that disparate TopLevelDecls cannot affect each other