aboutsummaryrefslogtreecommitdiff
path: root/lib/Lex/Pragma.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-04-19 21:50:08 +0000
committerChris Lattner <sabre@nondot.org>2009-04-19 21:50:08 +0000
commit6c5cf4a2e234923ab66127de0874a71cb6bfdd83 (patch)
tree3a2232913eee9056e5fae4b81f60b6bbaba8e8ed /lib/Lex/Pragma.cpp
parent4fb71b0cc3c199cc0c736b4ec4fabdd01f56f4e8 (diff)
diagnose invalid syntax of STDC pragmas.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69554 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Lex/Pragma.cpp')
-rw-r--r--lib/Lex/Pragma.cpp43
1 files changed, 40 insertions, 3 deletions
diff --git a/lib/Lex/Pragma.cpp b/lib/Lex/Pragma.cpp
index 6e8c03db8a..d30ff3c289 100644
--- a/lib/Lex/Pragma.cpp
+++ b/lib/Lex/Pragma.cpp
@@ -511,12 +511,48 @@ struct PragmaCommentHandler : public PragmaHandler {
};
// Pragma STDC implementations.
+
+enum STDCSetting {
+ STDC_ON, STDC_OFF, STDC_DEFAULT, STDC_INVALID
+};
+
+static STDCSetting LexOnOffSwitch(Preprocessor &PP) {
+ Token Tok;
+ PP.LexUnexpandedToken(Tok);
+
+ if (Tok.isNot(tok::identifier)) {
+ PP.Diag(Tok, diag::ext_stdc_pragma_syntax);
+ return STDC_INVALID;
+ }
+ IdentifierInfo *II = Tok.getIdentifierInfo();
+ STDCSetting Result;
+ if (II->isStr("ON"))
+ Result = STDC_ON;
+ else if (II->isStr("OFF"))
+ Result = STDC_OFF;
+ else if (II->isStr("DEFAULT"))
+ Result = STDC_DEFAULT;
+ else {
+ PP.Diag(Tok, diag::ext_stdc_pragma_syntax);
+ return STDC_INVALID;
+ }
+
+ // Verify that this is followed by EOM.
+ PP.LexUnexpandedToken(Tok);
+ if (Tok.isNot(tok::eom))
+ PP.Diag(Tok, diag::ext_stdc_pragma_syntax_eom);
+ return Result;
+}
/// PragmaSTDC_FP_CONTRACTHandler - "#pragma STDC FP_CONTRACT ...".
struct PragmaSTDC_FP_CONTRACTHandler : public PragmaHandler {
PragmaSTDC_FP_CONTRACTHandler(const IdentifierInfo *ID) : PragmaHandler(ID) {}
virtual void HandlePragma(Preprocessor &PP, Token &Tok) {
- //PP.HandlePragmaFP_CONTRACT(CommentTok);
+ // We just ignore the setting of FP_CONTRACT. Since we don't do contractions
+ // at all, our default is OFF and setting it to ON is an optimization hint
+ // we can safely ignore. When we support -ffma or something, we would need
+ // to diagnose that we are ignoring FMA.
+ LexOnOffSwitch(PP);
}
};
@@ -524,7 +560,7 @@ struct PragmaSTDC_FP_CONTRACTHandler : public PragmaHandler {
struct PragmaSTDC_FENV_ACCESSHandler : public PragmaHandler {
PragmaSTDC_FENV_ACCESSHandler(const IdentifierInfo *ID) : PragmaHandler(ID) {}
virtual void HandlePragma(Preprocessor &PP, Token &Tok) {
- //PP.HandlePragmaFENV_ACCESS(CommentTok);
+ LexOnOffSwitch(PP);
}
};
@@ -533,7 +569,7 @@ struct PragmaSTDC_CX_LIMITED_RANGEHandler : public PragmaHandler {
PragmaSTDC_CX_LIMITED_RANGEHandler(const IdentifierInfo *ID)
: PragmaHandler(ID) {}
virtual void HandlePragma(Preprocessor &PP, Token &Tok) {
- //PP.HandlePragmaCX_LIMITED_RANGE(CommentTok);
+ LexOnOffSwitch(PP);
}
};
@@ -541,6 +577,7 @@ struct PragmaSTDC_CX_LIMITED_RANGEHandler : public PragmaHandler {
struct PragmaSTDC_UnknownHandler : public PragmaHandler {
PragmaSTDC_UnknownHandler() : PragmaHandler(0) {}
virtual void HandlePragma(Preprocessor &PP, Token &UnknownTok) {
+ // C99 6.10.6p2, unknown forms are not allowed.
PP.Diag(UnknownTok, diag::ext_stdc_pragma_ignored);
}
};