forked from OSchip/llvm-project
Add compat/extension warnings for init captures.
llvm-svn: 191609
This commit is contained in:
parent
846f13ca14
commit
5b013f5050
|
@ -5069,6 +5069,11 @@ let CategoryName = "Lambda Issue" in {
|
|||
"here">;
|
||||
|
||||
// C++1y lambda init-captures.
|
||||
def warn_cxx11_compat_init_capture : Warning<
|
||||
"initialized lambda captures are incompatible with C++ standards "
|
||||
"before C++1y">, InGroup<CXXPre1yCompat>, DefaultIgnore;
|
||||
def ext_init_capture : ExtWarn<
|
||||
"initialized lambda captures are a C++1y extension">, InGroup<CXX1y>;
|
||||
def err_init_capture_no_expression : Error<
|
||||
"initializer missing for lambda capture %0">;
|
||||
def err_init_capture_multiple_expressions : Error<
|
||||
|
|
|
@ -703,6 +703,10 @@ void Sema::ActOnStartOfLambdaDefinition(LambdaIntroducer &Intro,
|
|||
|
||||
VarDecl *Var;
|
||||
if (C->Init.isUsable()) {
|
||||
Diag(C->Loc, getLangOpts().CPlusPlus1y
|
||||
? diag::warn_cxx11_compat_init_capture
|
||||
: diag::ext_init_capture);
|
||||
|
||||
if (C->Init.get()->containsUnexpandedParameterPack())
|
||||
ContainsUnexpandedParameterPack = true;
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify
|
||||
// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify -Wno-c++1y-extensions
|
||||
// RUN: %clang_cc1 -fsyntax-only -std=c++1y %s -verify
|
||||
|
||||
void print();
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// RUN: %clang_cc1 -std=c++11 %s -verify
|
||||
// RUN: %clang_cc1 -std=c++11 %s -verify -Wno-c++1y-extensions
|
||||
|
||||
class X0 {
|
||||
void explicit_capture() {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// RUN: %clang_cc1 -pedantic-errors -fblocks -std=c++11 -emit-pch %s -o %t-cxx11
|
||||
// RUN: %clang_cc1 -ast-print -pedantic-errors -fblocks -std=c++11 -include-pch %t-cxx11 %s | FileCheck -check-prefix=CHECK-PRINT %s
|
||||
// RUN: %clang_cc1 -pedantic-errors -fblocks -std=c++1y -emit-pch %s -o %t-cxx11
|
||||
// RUN: %clang_cc1 -ast-print -pedantic-errors -fblocks -std=c++1y -include-pch %t-cxx11 %s | FileCheck -check-prefix=CHECK-PRINT %s
|
||||
|
||||
#ifndef HEADER_INCLUDED
|
||||
|
||||
|
|
|
@ -52,14 +52,14 @@ class C {
|
|||
// We support init-captures in C++11 as an extension.
|
||||
int z;
|
||||
void init_capture() {
|
||||
[n(0)] () mutable -> int { return ++n; };
|
||||
[n{0}] { return; }; // expected-error {{<initializer_list>}}
|
||||
[n = 0] { return ++n; }; // expected-error {{captured by copy in a non-mutable}}
|
||||
[n = {0}] { return; }; // expected-error {{<initializer_list>}}
|
||||
[a([&b = z]{})](){};
|
||||
[n(0)] () mutable -> int { return ++n; }; // expected-warning{{extension}}
|
||||
[n{0}] { return; }; // expected-error {{<initializer_list>}} expected-warning{{extension}}
|
||||
[n = 0] { return ++n; }; // expected-error {{captured by copy in a non-mutable}} expected-warning{{extension}}
|
||||
[n = {0}] { return; }; // expected-error {{<initializer_list>}} expected-warning{{extension}}
|
||||
[a([&b = z]{})](){}; // expected-warning 2{{extension}}
|
||||
|
||||
int x = 4;
|
||||
auto y = [&r = x, x = x + 1]() -> int {
|
||||
auto y = [&r = x, x = x + 1]() -> int { // expected-warning 2{{extension}}
|
||||
r += 2;
|
||||
return x + 2;
|
||||
} ();
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify -Wno-unused-value -std=c++11 %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify -Wno-unused-value -Wno-c++1y-extensions -std=c++11 %s
|
||||
|
||||
class C {
|
||||
id get(int);
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -std=c++98 -Wc++11-compat -verify %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -std=c++1y -Wc++11-compat -verify %s
|
||||
|
||||
#if __cplusplus < 201103L
|
||||
|
||||
namespace N {
|
||||
template<typename T> void f(T) {} // expected-note 2{{here}}
|
||||
|
@ -37,3 +40,9 @@ void h(size_t foo, size_t bar) {
|
|||
|
||||
#define _x + 1
|
||||
char c = 'x'_x; // expected-warning {{will be treated as a user-defined literal suffix}}
|
||||
|
||||
#else
|
||||
|
||||
auto init_capture = [a(0)] {}; // expected-warning {{initialized lambda captures are incompatible with C++ standards before C++1y}}
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue