[PATCH] D85990: [Clang] Fix BZ47169, loader_uninitialized on incomplete types
Jon Chesterfield via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 14 12:43:01 PDT 2020
JonChesterfield created this revision.
JonChesterfield added reviewers: erichkeane, aaron.ballman, rjmccall.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
JonChesterfield requested review of this revision.
[Clang] Fix BZ47169, loader_uninitialized on incomplete types
Reported by @erichkeane. Fix proposed by @erichkeane works, tests included.
Bug introduced in D74361 <https://reviews.llvm.org/D74361>. Crash was on querying a CXXRecordDecl for
hasTrivialDefaultConstructor on an incomplete type. Fixed by calling
RequireCompleteType in the right place.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D85990
Files:
clang/lib/Sema/SemaDecl.cpp
clang/test/CodeGenCXX/attr-loader-uninitialized.cpp
clang/test/Sema/attr-loader-uninitialized.c
clang/test/Sema/attr-loader-uninitialized.cpp
Index: clang/test/Sema/attr-loader-uninitialized.cpp
===================================================================
--- clang/test/Sema/attr-loader-uninitialized.cpp
+++ clang/test/Sema/attr-loader-uninitialized.cpp
@@ -9,6 +9,11 @@
extern int external_rejected __attribute__((loader_uninitialized));
// expected-error at -1 {{variable 'external_rejected' cannot be declared both 'extern' and with the 'loader_uninitialized' attribute}}
+struct S;
+extern S incomplete_external_rejected __attribute__((loader_uninitialized));
+// expected-error at -1 {{variable has incomplete type 'S'}}
+// expected-note at -3 {{forward declaration of 'S'}}
+
int noargs __attribute__((loader_uninitialized(0)));
// expected-error at -1 {{'loader_uninitialized' attribute takes no arguments}}
@@ -58,3 +63,12 @@
nontrivial needs_trivial_ctor __attribute__((loader_uninitialized));
// expected-error at -1 {{variable with 'loader_uninitialized' attribute must have a trivial default constructor}}
+
+struct Incomplete;
+Incomplete incomplete __attribute__((loader_uninitialized));
+// expected-error at -1 {{variable has incomplete type 'Incomplete'}}
+// expected-note at -3 {{forward declaration of 'Incomplete'}}
+
+struct Incomplete s_incomplete __attribute__((loader_uninitialized));
+// expected-error at -1 {{variable has incomplete type 'struct Incomplete'}}
+// expected-note at -7 {{forward declaration of 'Incomplete'}}
Index: clang/test/Sema/attr-loader-uninitialized.c
===================================================================
--- clang/test/Sema/attr-loader-uninitialized.c
+++ clang/test/Sema/attr-loader-uninitialized.c
@@ -10,6 +10,11 @@
extern int external_rejected __attribute__((loader_uninitialized));
// expected-error at -1 {{variable 'external_rejected' cannot be declared both 'extern' and with the 'loader_uninitialized' attribute}}
+struct S;
+extern struct S incomplete_external_rejected __attribute__((loader_uninitialized));
+// expected-error at -1 {{variable has incomplete type 'struct S'}}
+// expected-note at -3 {{forward declaration of 'struct S'}}
+
int noargs __attribute__((loader_uninitialized(0)));
// expected-error at -1 {{'loader_uninitialized' attribute takes no arguments}}
@@ -35,3 +40,8 @@
extern __attribute__((visibility("hidden"))) int extern_hidden __attribute__((loader_uninitialized));
// expected-error at -1 {{variable 'extern_hidden' cannot be declared both 'extern' and with the 'loader_uninitialized' attribute}}
+
+struct Incomplete;
+struct Incomplete incomplete __attribute__((loader_uninitialized));
+// expected-error at -1 {{variable has incomplete type 'struct Incomplete'}}
+// expected-note at -3 {{forward declaration of 'struct Incomplete'}}
Index: clang/test/CodeGenCXX/attr-loader-uninitialized.cpp
===================================================================
--- clang/test/CodeGenCXX/attr-loader-uninitialized.cpp
+++ clang/test/CodeGenCXX/attr-loader-uninitialized.cpp
@@ -28,3 +28,15 @@
// Defining as arr2[] [[clang..]] raises the error: attribute cannot be applied to types
// CHECK: @arr2 = global [4 x double] undef
double arr2 [[clang::loader_uninitialized]] [4];
+
+template<typename T> struct templ{T * t;};
+
+// CHECK: @templ_int = global %struct.templ undef, align 8
+templ<int> templ_int [[clang::loader_uninitialized]];
+
+// CHECK: @templ_trivial = global %struct.templ.0 undef, align 8
+templ<trivial> templ_trivial [[clang::loader_uninitialized]];
+
+// CHECK: @templ_incomplete = global %struct.templ.1 undef, align 8
+struct incomplete;
+templ<incomplete> templ_incomplete [[clang::loader_uninitialized]];
Index: clang/lib/Sema/SemaDecl.cpp
===================================================================
--- clang/lib/Sema/SemaDecl.cpp
+++ clang/lib/Sema/SemaDecl.cpp
@@ -12476,6 +12476,11 @@
}
if (!Var->isInvalidDecl() && RealDecl->hasAttr<LoaderUninitializedAttr>()) {
+ if (RequireCompleteType(Var->getLocation(), Var->getType(),
+ diag::err_typecheck_decl_incomplete_type)) {
+ Var->setInvalidDecl();
+ return;
+ }
if (CXXRecordDecl *RD = Var->getType()->getAsCXXRecordDecl()) {
if (!RD->hasTrivialDefaultConstructor()) {
Diag(Var->getLocation(), diag::err_loader_uninitialized_trivial_ctor);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D85990.285737.patch
Type: text/x-patch
Size: 4274 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200814/c59ad7ec/attachment.bin>
More information about the cfe-commits
mailing list