Skip to content

Commit bbda49c

Browse files
authored
Merge pull request #61959 from xedin/type-wrappers-improve-multi-wrapper-error
[Sema] TypeWrappers: Improve use of multiple type wrappers diagnostic
2 parents 48604ca + 6fdadc7 commit bbda49c

File tree

3 files changed

+22
-2
lines changed

3 files changed

+22
-2
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6613,7 +6613,8 @@ ERROR(type_wrapper_requires_two_generic_params,none,
66136613
"wrapped and storage types", ())
66146614

66156615
ERROR(cannot_use_multiple_type_wrappers,none,
6616-
"type %0 cannot use more than one type wrapper", ())
6616+
"%0 %1 cannot use more than one type wrapper",
6617+
(DescriptiveDeclKind, DeclName))
66176618

66186619
ERROR(type_wrapper_requires_memberwise_init,none,
66196620
"type wrapper type %0 does not contain a required initializer"

lib/Sema/TypeCheckTypeWrapper.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,14 @@ NominalTypeDecl *GetTypeWrapper::evaluate(Evaluator &evaluator,
116116
return nullptr;
117117

118118
if (typeWrappers.size() != 1) {
119-
ctx.Diags.diagnose(decl, diag::cannot_use_multiple_type_wrappers);
119+
ctx.Diags.diagnose(decl, diag::cannot_use_multiple_type_wrappers,
120+
decl->getDescriptiveKind(), decl->getName());
121+
122+
for (const auto &attr : typeWrappers) {
123+
ctx.Diags.diagnose(attr.first->getLocation(), diag::decl_declared_here,
124+
attr.second->getName());
125+
}
126+
120127
return nullptr;
121128
}
122129

test/type/type_wrapper.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -641,3 +641,15 @@ do {
641641
// expected-error@-1 {{missing arguments for parameters 'a', 'b' in call}}
642642
// expected-error@-2 {{extra argument 'storageWrapper' in call}}
643643
}
644+
645+
func test_multiple_wrapper_attributes() {
646+
@Parent.Wrapper @NoopWrapper
647+
// expected-note@-1 {{'Wrapper' declared here}}
648+
// expected-note@-2 {{'NoopWrapper' declared here}}
649+
struct Test1 {} // expected-error {{struct 'Test1' cannot use more than one type wrapper}}
650+
651+
@Parent.Wrapper @NoopWrapper
652+
// expected-note@-1 {{'Wrapper' declared here}}
653+
// expected-note@-2 {{'NoopWrapper' declared here}}
654+
class Test2 {} // expected-error {{class 'Test2' cannot use more than one type wrapper}}
655+
}

0 commit comments

Comments
 (0)