[llvm-branch-commits] [cfe-branch] r228799 - Merging r228792:

Hans Wennborg hans at hanshq.net
Tue Feb 10 19:32:18 PST 2015


Author: hans
Date: Tue Feb 10 21:32:18 2015
New Revision: 228799

URL: http://llvm.org/viewvc/llvm-project?rev=228799&view=rev
Log:
Merging r228792:
------------------------------------------------------------------------
r228792 | rsmith | 2015-02-10 18:41:33 -0800 (Tue, 10 Feb 2015) | 5 lines

Add a warning for direct-list-initialization of a variable with a deduced type
(or of a lambda init-capture, which is sort-of such a variable). The semantics
of such constructs will change when we implement N3922, so we intend to warn on
this in Clang 3.6 then change the semantics in Clang 3.7.

------------------------------------------------------------------------

Modified:
    cfe/branches/release_36/   (props changed)
    cfe/branches/release_36/include/clang/Basic/DiagnosticGroups.td
    cfe/branches/release_36/include/clang/Basic/DiagnosticParseKinds.td
    cfe/branches/release_36/include/clang/Basic/DiagnosticSemaKinds.td
    cfe/branches/release_36/lib/Parse/ParseExprCXX.cpp
    cfe/branches/release_36/lib/Sema/SemaDecl.cpp
    cfe/branches/release_36/test/CXX/expr/expr.prim/expr.prim.lambda/p11-1y.cpp
    cfe/branches/release_36/test/Parser/cxx0x-lambda-expressions.cpp
    cfe/branches/release_36/test/Parser/objcxx0x-lambda-expressions.mm
    cfe/branches/release_36/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp

Propchange: cfe/branches/release_36/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Feb 10 21:32:18 2015
@@ -1,4 +1,4 @@
 /cfe/branches/type-system-rewrite:134693-134817
-/cfe/trunk:226008,226049,226136,226282,226382,226384,226624,226707,226754,226863,226877,227062,227088,227220,227251,227278,227295,227368,227393,227861,227979,228053,228464,228785
+/cfe/trunk:226008,226049,226136,226282,226382,226384,226624,226707,226754,226863,226877,227062,227088,227220,227251,227278,227295,227368,227393,227861,227979,228053,228464,228785,228792
 /cfe/trunk/test:170344
 /cfe/trunk/test/SemaTemplate:126920

Modified: cfe/branches/release_36/include/clang/Basic/DiagnosticGroups.td
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_36/include/clang/Basic/DiagnosticGroups.td?rev=228799&r1=228798&r2=228799&view=diff
==============================================================================
--- cfe/branches/release_36/include/clang/Basic/DiagnosticGroups.td (original)
+++ cfe/branches/release_36/include/clang/Basic/DiagnosticGroups.td Tue Feb 10 21:32:18 2015
@@ -749,3 +749,6 @@ def SerializedDiagnostics : DiagGroup<"s
 // A warning group for warnings about code that clang accepts when
 // compiling CUDA C/C++ but which is not compatible with the CUDA spec.
 def CudaCompat : DiagGroup<"cuda-compat">;
+
+// A warning group for things that will change semantics in the future.
+def FutureCompat : DiagGroup<"future-compat">;

Modified: cfe/branches/release_36/include/clang/Basic/DiagnosticParseKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_36/include/clang/Basic/DiagnosticParseKinds.td?rev=228799&r1=228798&r2=228799&view=diff
==============================================================================
--- cfe/branches/release_36/include/clang/Basic/DiagnosticParseKinds.td (original)
+++ cfe/branches/release_36/include/clang/Basic/DiagnosticParseKinds.td Tue Feb 10 21:32:18 2015
@@ -802,6 +802,10 @@ def warn_cxx98_compat_lambda : Warning<
 def err_lambda_missing_parens : Error<
   "lambda requires '()' before %select{'mutable'|return type|"
   "attribute specifier}0">;
+def warn_init_capture_direct_list_init : Warning<
+  "direct list initialization of a lambda init-capture will change meaning in "
+  "a future version of Clang; insert an '=' to avoid a change in behavior">,
+  InGroup<FutureCompat>;
 
 // Availability attribute
 def err_expected_version : Error<

Modified: cfe/branches/release_36/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_36/include/clang/Basic/DiagnosticSemaKinds.td?rev=228799&r1=228798&r2=228799&view=diff
==============================================================================
--- cfe/branches/release_36/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/branches/release_36/include/clang/Basic/DiagnosticSemaKinds.td Tue Feb 10 21:32:18 2015
@@ -1635,6 +1635,10 @@ def err_auto_var_init_multiple_expressio
 def err_auto_var_init_paren_braces : Error<
   "cannot deduce type for variable %0 with type %1 from "
   "parenthesized initializer list">;
+def warn_auto_var_direct_list_init : Warning<
+  "direct list initialization of a variable with a deduced type will change "
+  "meaning in a future version of Clang; insert an '=' to avoid a change in "
+  "behavior">, InGroup<FutureCompat>;
 def err_auto_new_ctor_multiple_expressions : Error<
   "new expression for type %0 contains multiple constructor arguments">;
 def err_auto_missing_trailing_return : Error<

Modified: cfe/branches/release_36/lib/Parse/ParseExprCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_36/lib/Parse/ParseExprCXX.cpp?rev=228799&r1=228798&r2=228799&view=diff
==============================================================================
--- cfe/branches/release_36/lib/Parse/ParseExprCXX.cpp (original)
+++ cfe/branches/release_36/lib/Parse/ParseExprCXX.cpp Tue Feb 10 21:32:18 2015
@@ -894,11 +894,16 @@ Optional<unsigned> Parser::ParseLambdaIn
         // to save the necessary state, and restore it later.
         EnterExpressionEvaluationContext EC(Actions,
                                             Sema::PotentiallyEvaluated);
-        TryConsumeToken(tok::equal);
+        bool HadEquals = TryConsumeToken(tok::equal);
 
-        if (!SkippedInits)
+        if (!SkippedInits) {
+          // Warn on constructs that will change meaning when we implement N3922
+          if (!HadEquals && Tok.is(tok::l_brace)) {
+            Diag(Tok, diag::warn_init_capture_direct_list_init)
+              << FixItHint::CreateInsertion(Tok.getLocation(), "=");
+          }
           Init = ParseInitializer();
-        else if (Tok.is(tok::l_brace)) {
+        } else if (Tok.is(tok::l_brace)) {
           BalancedDelimiterTracker Braces(*this, tok::l_brace);
           Braces.consumeOpen();
           Braces.skipToEnd();

Modified: cfe/branches/release_36/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_36/lib/Sema/SemaDecl.cpp?rev=228799&r1=228798&r2=228799&view=diff
==============================================================================
--- cfe/branches/release_36/lib/Sema/SemaDecl.cpp (original)
+++ cfe/branches/release_36/lib/Sema/SemaDecl.cpp Tue Feb 10 21:32:18 2015
@@ -8702,6 +8702,14 @@ void Sema::AddInitializerToDecl(Decl *Re
     CheckVariableDeclarationType(VDecl);
     if (VDecl->isInvalidDecl())
       return;
+
+    // If all looks well, warn if this is a case that will change meaning when
+    // we implement N3922.
+    if (DirectInit && !CXXDirectInit && isa<InitListExpr>(Init)) {
+      Diag(Init->getLocStart(),
+           diag::warn_auto_var_direct_list_init)
+        << FixItHint::CreateInsertion(Init->getLocStart(), "=");
+    }
   }
 
   // dllimport cannot be used on variable definitions.

Modified: cfe/branches/release_36/test/CXX/expr/expr.prim/expr.prim.lambda/p11-1y.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_36/test/CXX/expr/expr.prim/expr.prim.lambda/p11-1y.cpp?rev=228799&r1=228798&r2=228799&view=diff
==============================================================================
--- cfe/branches/release_36/test/CXX/expr/expr.prim/expr.prim.lambda/p11-1y.cpp (original)
+++ cfe/branches/release_36/test/CXX/expr/expr.prim/expr.prim.lambda/p11-1y.cpp Tue Feb 10 21:32:18 2015
@@ -48,7 +48,7 @@ auto bad_init_2 = [a(1, 2)] {}; // expec
 auto bad_init_3 = [&a(void_fn())] {}; // expected-error {{cannot form a reference to 'void'}}
 auto bad_init_4 = [a(void_fn())] {}; // expected-error {{has incomplete type 'void'}}
 auto bad_init_5 = [a(overload_fn)] {}; // expected-error {{cannot deduce type for lambda capture 'a' from initializer of type '<overloaded function}}
-auto bad_init_6 = [a{overload_fn}] {}; // expected-error {{cannot deduce type for lambda capture 'a' from initializer list}}
+auto bad_init_6 = [a{overload_fn}] {}; // expected-error {{cannot deduce type for lambda capture 'a' from initializer list}} expected-warning {{will change meaning in a future version of Clang}}
 
 template<typename...T> void pack_1(T...t) { (void)[a(t...)] {}; } // expected-error {{initializer missing for lambda capture 'a'}}
 template void pack_1<>(); // expected-note {{instantiation of}}
@@ -61,7 +61,7 @@ auto a = [a(4), b = 5, &c = static_cast<
   using T = decltype(c);
   using T = const int &;
 };
-auto b = [a{0}] {}; // expected-error {{include <initializer_list>}}
+auto b = [a{0}] {}; // expected-error {{include <initializer_list>}} expected-warning {{will change meaning in a future version of Clang}}
 
 struct S { S(); S(S&&); };
 template<typename T> struct remove_reference { typedef T type; };

Modified: cfe/branches/release_36/test/Parser/cxx0x-lambda-expressions.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_36/test/Parser/cxx0x-lambda-expressions.cpp?rev=228799&r1=228798&r2=228799&view=diff
==============================================================================
--- cfe/branches/release_36/test/Parser/cxx0x-lambda-expressions.cpp (original)
+++ cfe/branches/release_36/test/Parser/cxx0x-lambda-expressions.cpp Tue Feb 10 21:32:18 2015
@@ -61,7 +61,7 @@ class C {
   int z;
   void init_capture() {
     [n(0)] () mutable -> int { return ++n; }; // expected-warning{{extension}}
-    [n{0}] { return; }; // expected-error {{<initializer_list>}} expected-warning{{extension}}
+    [n{0}] { return; }; // expected-error {{<initializer_list>}} expected-warning{{extension}} expected-warning{{will change meaning in a future version}}
     [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}}

Modified: cfe/branches/release_36/test/Parser/objcxx0x-lambda-expressions.mm
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_36/test/Parser/objcxx0x-lambda-expressions.mm?rev=228799&r1=228798&r2=228799&view=diff
==============================================================================
--- cfe/branches/release_36/test/Parser/objcxx0x-lambda-expressions.mm (original)
+++ cfe/branches/release_36/test/Parser/objcxx0x-lambda-expressions.mm Tue Feb 10 21:32:18 2015
@@ -21,7 +21,7 @@ class C {
 
     [foo(bar)] () {};
     [foo = bar] () {};
-    [foo{bar}] () {}; // expected-error {{<initializer_list>}}
+    [foo{bar}] () {}; // expected-error {{<initializer_list>}} expected-warning {{will change meaning}}
     [foo = {bar}] () {}; // expected-error {{<initializer_list>}}
 
     [foo(bar) baz] () {}; // expected-error {{called object type 'int' is not a function}}

Modified: cfe/branches/release_36/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_36/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp?rev=228799&r1=228798&r2=228799&view=diff
==============================================================================
--- cfe/branches/release_36/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp (original)
+++ cfe/branches/release_36/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp Tue Feb 10 21:32:18 2015
@@ -117,6 +117,7 @@ void argument_deduction() {
 
 void auto_deduction() {
   auto l = {1, 2, 3, 4};
+  auto l2 {1, 2, 3, 4}; // expected-warning {{will change meaning in a future version of Clang}}
   static_assert(same_type<decltype(l), std::initializer_list<int>>::value, "");
   auto bl = {1, 2.0}; // expected-error {{cannot deduce}}
 





More information about the llvm-branch-commits mailing list