svn commit: r328555 - in stable: 10/contrib/llvm/tools/clang/include/clang/Basic 10/contrib/llvm/tools/clang/lib/Sema 9/contrib/llvm/tools/clang/include/clang/Basic 9/contrib/llvm/tools/clang/lib/Sema

Dimitry Andric dim at FreeBSD.org
Mon Jan 29 18:11:28 UTC 2018


Author: dim
Date: Mon Jan 29 18:11:27 2018
New Revision: 328555
URL: https://svnweb.freebsd.org/changeset/base/328555

Log:
  Pull in r217197 from upstream clang trunk (by Richard Smith):
  
    PR20844: If we fail to list-initialize a reference, map to the
    referenced type before retrying the initialization to produce
    diagnostics. Otherwise, we may fail to produce any diagnostics, and
    silently produce invalid AST in a -Asserts build. Also add a note to
    this codepath to make it more clear why we were trying to create a
    temporary.
  
  This should fix assertions when parsing some forms of incomplete list
  intializers.
  
  Direct commit to stable/9 and stable/10, since stable/11 and head
  already have this upstream fix.
  
  Reported by:	ajcbowhill at gmail.com
  PR:		202665

Modified:
  stable/9/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td
  stable/9/contrib/llvm/tools/clang/lib/Sema/SemaInit.cpp

Changes in other areas also in this revision:
Modified:
  stable/10/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td
  stable/10/contrib/llvm/tools/clang/lib/Sema/SemaInit.cpp

Modified: stable/9/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td
==============================================================================
--- stable/9/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td	Mon Jan 29 18:07:14 2018	(r328554)
+++ stable/9/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td	Mon Jan 29 18:11:27 2018	(r328555)
@@ -1419,6 +1419,9 @@ def warn_uninit_byref_blockvar_captured_by_block : War
   InGroup<Uninitialized>, DefaultIgnore;
 def note_block_var_fixit_add_initialization : Note<
   "maybe you meant to use __block %0">;
+def note_in_reference_temporary_list_initializer : Note<
+  "in initialization of temporary of type %0 created to "
+  "list-initialize this reference">;
 def note_var_fixit_add_initialization : Note<
   "initialize the variable %0 to silence this warning">;
 def note_uninit_fixit_remove_cond : Note<

Modified: stable/9/contrib/llvm/tools/clang/lib/Sema/SemaInit.cpp
==============================================================================
--- stable/9/contrib/llvm/tools/clang/lib/Sema/SemaInit.cpp	Mon Jan 29 18:07:14 2018	(r328554)
+++ stable/9/contrib/llvm/tools/clang/lib/Sema/SemaInit.cpp	Mon Jan 29 18:11:27 2018	(r328555)
@@ -6309,6 +6309,19 @@ static void diagnoseListInit(Sema &S, const Initialize
     return diagnoseListInit(S, HiddenArray, InitList);
   }
 
+  if (DestType->isReferenceType()) {
+    // A list-initialization failure for a reference means that we tried to
+    // create a temporary of the inner type (per [dcl.init.list]p3.6) and the
+    // inner initialization failed.
+    QualType T = DestType->getAs<ReferenceType>()->getPointeeType();
+    diagnoseListInit(S, InitializedEntity::InitializeTemporary(T), InitList);
+    SourceLocation Loc = InitList->getLocStart();
+    if (auto *D = Entity.getDecl())
+      Loc = D->getLocation();
+    S.Diag(Loc, diag::note_in_reference_temporary_list_initializer) << T;
+    return;
+  }
+
   InitListChecker DiagnoseInitList(S, Entity, InitList, DestType,
                                    /*VerifyOnly=*/false);
   assert(DiagnoseInitList.HadError() &&


More information about the svn-src-all mailing list