This revision was automatically updated to reflect the committed changes.
sepavloff marked an inline comment as done.
Closed by commit rL367779: [Parser] Emit descriptive diagnostic for misplaced
pragma (authored by sepavloff, committed by ).
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
Changed prior to commit:
https://reviews.llvm.org/D64932?vs=213023&id=213239#toc
Repository:
rL LLVM
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D64932/new/
https://reviews.llvm.org/D64932
Files:
cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td
cfe/trunk/lib/Parse/ParseDecl.cpp
cfe/trunk/lib/Parse/ParseDeclCXX.cpp
cfe/trunk/test/Parser/pragma-attribute-context.cpp
cfe/trunk/test/Parser/pragma-fp-contract.c
cfe/trunk/test/Parser/pragma-fp-contract.cpp
Index: cfe/trunk/lib/Parse/ParseDeclCXX.cpp
===================================================================
--- cfe/trunk/lib/Parse/ParseDeclCXX.cpp
+++ cfe/trunk/lib/Parse/ParseDeclCXX.cpp
@@ -3134,6 +3134,13 @@
TagDecl);
default:
+ if (tok::isPragmaAnnotation(Tok.getKind())) {
+ Diag(Tok.getLocation(), diag::err_pragma_misplaced_in_decl)
+ << DeclSpec::getSpecifierName(TagType,
+ Actions.getASTContext().getPrintingPolicy());
+ ConsumeAnnotationToken();
+ return nullptr;
+ }
return ParseCXXClassMemberDeclaration(AS, AccessAttrs);
}
}
Index: cfe/trunk/lib/Parse/ParseDecl.cpp
===================================================================
--- cfe/trunk/lib/Parse/ParseDecl.cpp
+++ cfe/trunk/lib/Parse/ParseDecl.cpp
@@ -4148,6 +4148,14 @@
continue;
}
+ if (tok::isPragmaAnnotation(Tok.getKind())) {
+ Diag(Tok.getLocation(), diag::err_pragma_misplaced_in_decl)
+ << DeclSpec::getSpecifierName(
+ TagType, Actions.getASTContext().getPrintingPolicy());
+ ConsumeAnnotationToken();
+ continue;
+ }
+
if (!Tok.is(tok::at)) {
auto CFieldCallback = [&](ParsingFieldDeclarator &FD) {
// Install the declarator into the current TagDecl.
Index: cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td
===================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td
+++ cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td
@@ -974,6 +974,8 @@
def warn_pragma_invalid_argument : Warning<
"unexpected argument '%0' to '#pragma %1'%select{|; expected %3}2">, InGroup<IgnoredPragmas>;
+def err_pragma_misplaced_in_decl : Error<"this pragma cannot appear in %0 declaration">;
+
// '#pragma clang section' related errors
def err_pragma_expected_clang_section_name : Error<
"expected one of [bss|data|rodata|text] section kind in '#pragma %0'">;
Index: cfe/trunk/test/Parser/pragma-fp-contract.c
===================================================================
--- cfe/trunk/test/Parser/pragma-fp-contract.c
+++ cfe/trunk/test/Parser/pragma-fp-contract.c
@@ -10,3 +10,16 @@
#pragma STDC FP_CONTRACT OFF
#pragma STDC FP_CONTRACT ON
}
+
+struct S1 {
+// expected-error@+1 {{this pragma cannot appear in struct declaration}}
+#pragma STDC FP_CONTRACT ON
+ float f1;
+};
+
+union U1 {
+ float f1;
+ float f2;
+// expected-error@+1 {{this pragma cannot appear in union declaration}}
+#pragma STDC FP_CONTRACT ON
+};
Index: cfe/trunk/test/Parser/pragma-fp-contract.cpp
===================================================================
--- cfe/trunk/test/Parser/pragma-fp-contract.cpp
+++ cfe/trunk/test/Parser/pragma-fp-contract.cpp
@@ -0,0 +1,32 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+void f1(void) {
+ int x = 0;
+/* expected-error@+1 {{'#pragma fp_contract' can only appear at file scope or at the start of a compound statement}} */
+#pragma STDC FP_CONTRACT ON
+}
+
+void f2(void) {
+ #pragma STDC FP_CONTRACT OFF
+ #pragma STDC FP_CONTRACT ON
+}
+
+struct S1 {
+// expected-error@+1 {{this pragma cannot appear in struct declaration}}
+#pragma STDC FP_CONTRACT ON
+ float f1;
+};
+
+union U1 {
+ float f1;
+ float f2;
+// expected-error@+1 {{this pragma cannot appear in union declaration}}
+#pragma STDC FP_CONTRACT ON
+};
+
+class C1 {
+ float f1;
+// expected-error@+1 {{this pragma cannot appear in class declaration}}
+#pragma STDC FP_CONTRACT ON
+ float f2;
+};
Index: cfe/trunk/test/Parser/pragma-attribute-context.cpp
===================================================================
--- cfe/trunk/test/Parser/pragma-attribute-context.cpp
+++ cfe/trunk/test/Parser/pragma-attribute-context.cpp
@@ -31,8 +31,7 @@
struct InStruct {
// FIXME: This asserts in Objective-C++!
- // FIXME: This is a horrible diagnostic!
#ifndef __OBJC__
- BEGIN_PRAGMA // expected-error {{expected member name or ';' after declaration specifiers}}
+ BEGIN_PRAGMA // expected-error {{this pragma cannot appear in struct declaration}}
#endif
};
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits