]> granicus.if.org Git - clang/commitdiff
Add missing warning for use of C++1z init-statements in C++14 and before.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 18 Oct 2016 20:27:16 +0000 (20:27 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 18 Oct 2016 20:27:16 +0000 (20:27 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@284530 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticParseKinds.td
lib/Parse/ParseExprCXX.cpp
test/SemaCXX/warn-c++1z-extensions.cpp [new file with mode: 0644]

index fd9c9626f739f05dd5a0692315370cb62988651b..b5b90559b6e9c33980d093a2efe2095706ec0cbf 100644 (file)
@@ -521,6 +521,12 @@ def ext_constexpr_if : ExtWarn<
 def warn_cxx14_compat_constexpr_if : Warning<
   "constexpr if is incompatible with C++ standards before C++1z">,
   DefaultIgnore, InGroup<CXXPre1zCompat>;
+def ext_init_statement : ExtWarn<
+  "'%select{if|switch}0' initialization statements are a C++1z extension">,
+  InGroup<CXX1z>;
+def warn_cxx14_compat_init_statement : Warning<
+  "%select{if|switch}0 initialization statements are incompatible with "
+  "C++ standards before C++1z">, DefaultIgnore, InGroup<CXXPre1zCompat>;
 
 // C++ derived classes
 def err_dup_virtual : Error<"duplicate 'virtual' in base specifier">;
index 614ba8fe25a57355a45e7a4b4523081e98ac39cd..83e6ae4ef53e069cae378c5629998b0fd29be814 100644 (file)
@@ -1787,6 +1787,10 @@ Sema::ConditionResult Parser::ParseCXXCondition(StmtResult *InitStmt,
   }
 
   case ConditionOrInitStatement::InitStmtDecl: {
+    Diag(Tok.getLocation(), getLangOpts().CPlusPlus1z
+                                ? diag::warn_cxx14_compat_init_statement
+                                : diag::ext_init_statement)
+        << (CK == Sema::ConditionKind::Switch);
     SourceLocation DeclStart = Tok.getLocation(), DeclEnd;
     DeclGroupPtrTy DG = ParseSimpleDeclaration(
         Declarator::InitStmtContext, DeclEnd, attrs, /*RequireSemi=*/true);
diff --git a/test/SemaCXX/warn-c++1z-extensions.cpp b/test/SemaCXX/warn-c++1z-extensions.cpp
new file mode 100644 (file)
index 0000000..9b5e1c2
--- /dev/null
@@ -0,0 +1,8 @@
+// RUN: %clang_cc1 -fsyntax-only -std=c++14 -verify %s
+
+void f() {
+  if (bool b = true; b) {} // expected-warning {{'if' initialization statements are a C++1z extension}}
+  switch (int n = 5; n) { // expected-warning {{'switch' initialization statements are a C++1z extension}}
+  case 5: break;
+  }
+}