Skip to content

Commit d2bea2a

Browse files
committed
Hyperobject struct members must be initialized
1 parent 8fab1be commit d2bea2a

File tree

7 files changed

+24
-9
lines changed

7 files changed

+24
-9
lines changed

clang/include/clang/Basic/DiagnosticSemaKinds.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5896,7 +5896,7 @@ def note_deleted_special_member_class_subobject : Note<
58965896
def note_deleted_default_ctor_uninit_field : Note<
58975897
"%select{default constructor of|constructor inherited by}0 "
58985898
"%1 is implicitly deleted because field %2 of "
5899-
"%select{reference|const-qualified}4 type %3 would not be initialized">;
5899+
"%select{reference|const-qualified|reducer}4 type %3 would not be initialized">;
59005900
def note_deleted_default_ctor_all_const : Note<
59015901
"%select{default constructor of|constructor inherited by}0 "
59025902
"%1 is implicitly deleted because all "

clang/lib/AST/DeclCXX.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1088,8 +1088,8 @@ void CXXRecordDecl::addedMember(Decl *D) {
10881088
// suppress hyperobject registration.
10891089
data().Aggregate = false;
10901090
data().HasIrrelevantDestructor = false;
1091-
data().HasTrivialSpecialMembers &= ~SMF_Destructor;
1092-
data().HasTrivialSpecialMembersForCall &= ~SMF_Destructor;
1091+
data().HasTrivialSpecialMembers &= ~SMF_All;
1092+
data().HasTrivialSpecialMembersForCall &= ~SMF_All;
10931093
}
10941094

10951095
if (!Field->hasInClassInitializer() && !Field->isMutable()) {

clang/lib/Sema/SemaDeclCXX.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9595,6 +9595,12 @@ bool SpecialMemberDeletionInfo::shouldDeleteForField(FieldDecl *FD) {
95959595
<< !!ICI << MD->getParent() << FD << FieldType << /*Reference*/0;
95969596
return true;
95979597
}
9598+
if (FieldType->isHyperobjectType() && !FD->hasInClassInitializer()) {
9599+
if (Diagnose)
9600+
S.Diag(FD->getLocation(), diag::note_deleted_default_ctor_uninit_field)
9601+
<< !!ICI << MD->getParent() << FD << FieldType << /*Reducer*/2;
9602+
return true;
9603+
}
95989604
// C++11 [class.ctor]p5 (modified by DR2394): any non-variant non-static
95999605
// data member of const-qualified type (or array thereof) with no
96009606
// brace-or-equal-initializer is not const-default-constructible.

clang/test/Cilk/hyper-errors.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// RUN: %clang_cc1 %s -x c++ -fopencilk -verify -fsyntax-only
2-
struct C { int _Hyperobject c; };
2+
struct C { int _Hyperobject c = 0; };
33
struct C _Hyperobject c; // expected-error{{type 'struct C', which contains a hyperobject, may not be a hyperobject}}
44
long _Hyperobject d; // expected-note{{previous definition}}
55
void f() {
Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
// RUN: %clang_cc1 %s -fopencilk -verify -fsyntax-only
22
extern void id(void *), reduce(void *, void *);
3-
struct one_hyperobject {
3+
struct uninit_hyperobject {
44
// expected-note@-1{{implicit copy}}
55
// expected-note@-2{{implicit move}}
66
// expected-note@-3{{implicit default}}
77
int _Hyperobject(id, reduce) field;
8+
// expected-note@-1{{would not be initialized}}
89
};
910

1011
// braced initializer lists do not work
11-
one_hyperobject h1 = {-1};
12+
uninit_hyperobject h1 = {-1};
1213
// expected-error@-1{{no matching constructor for initialization}}
1314

14-
one_hyperobject h2;
15+
uninit_hyperobject h2;
16+
// expected-error@-1{{implicitly-deleted default constructor}}
17+
18+
struct init_hyperobject {
19+
int _Hyperobject(id, reduce) field = 0;
20+
};
21+
22+
init_hyperobject h3;

clang/test/Cilk/hyper-register.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
struct S {
44
static void identity(void *);
55
static void reduce(void *, void *);
6-
int _Hyperobject(identity, reduce) member;
6+
int _Hyperobject(identity, reduce) member = 0;
77
S();
88
~S();
99
};

clang/test/Cilk/hyper-template-errors.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ struct reducer
77
// expected-error@-1{{type 'long _Hyperobject', which contains a hyperobject, may not be a hyperobject}}
88
// expected-error@-2{{type 'reducer<char>', which contains a hyperobject, may not be a hyperobject}}
99
// expected-error@-3{{type 'wrap<int _Hyperobject>', which contains a hyperobject, may not be a hyperobject}}
10-
int _Hyperobject value2;
10+
int _Hyperobject value2 = 0;
11+
reducer();
1112
};
1213

1314
reducer<long _Hyperobject> r_hl; // expected-note{{in instantiation}}

0 commit comments

Comments
 (0)