[PATCH] D134885: [Clang] Fix variant crashes from GH58028, GH57370
Roy Jacobson via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Sep 30 01:09:16 PDT 2022
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
royjacobson marked an inline comment as done.
Closed by commit rG9706bb3165f5: [Clang] Fix variant crashes from GH58028, GH57370 (authored by royjacobson).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D134885/new/
https://reviews.llvm.org/D134885
Files:
clang/lib/Sema/SemaInit.cpp
clang/test/SemaCXX/specialization-diagnose-crash.cpp
Index: clang/test/SemaCXX/specialization-diagnose-crash.cpp
===================================================================
--- /dev/null
+++ clang/test/SemaCXX/specialization-diagnose-crash.cpp
@@ -0,0 +1,24 @@
+// RUN: %clang_cc1 -fsyntax-only %s -verify
+// This is a reduction of GH57370 and GH58028, originally appearing
+// in libstdc++'s variant code.
+
+struct V1 {};
+struct V2 : V1 {
+ int &a;
+};
+
+template <class T> using void_t = void;
+
+template <class T> struct X { T x; };
+
+template <class T1, class T2, class = void> struct Variant {
+ Variant() = delete; // expected-note {{deleted here}}
+};
+
+template <class T1, class T2>
+struct Variant<T1, T2, void_t<decltype(X<T2>{T1()})>> {};
+
+void f() {
+ Variant<V1, V1>();
+ Variant<V1, V2>(); // expected-error {{call to deleted constructor}}
+}
Index: clang/lib/Sema/SemaInit.cpp
===================================================================
--- clang/lib/Sema/SemaInit.cpp
+++ clang/lib/Sema/SemaInit.cpp
@@ -695,10 +695,10 @@
// member of reference type uninitialized, the program is
// ill-formed.
SemaRef.Diag(Loc, diag::err_init_reference_member_uninitialized)
- << Field->getType()
- << ILE->getSyntacticForm()->getSourceRange();
- SemaRef.Diag(Field->getLocation(),
- diag::note_uninit_reference_member);
+ << Field->getType()
+ << (ILE->isSyntacticForm() ? ILE : ILE->getSyntacticForm())
+ ->getSourceRange();
+ SemaRef.Diag(Field->getLocation(), diag::note_uninit_reference_member);
}
hadError = true;
return;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D134885.464173.patch
Type: text/x-patch
Size: 1649 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220930/78148157/attachment-0001.bin>
More information about the cfe-commits
mailing list