Skip to content

Commit 6fdadc7

Browse files
committed
[Sema] TypeWrappers: Improve use of multiple type wrappers diagnostic
Adds a kind of the declaration and mentions all of the wrappers. This is going to be expended by type wrapper inference from protocols to distinguish between direct and inferred wrappers.
1 parent 71f528a commit 6fdadc7

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
@@ -6615,7 +6615,8 @@ ERROR(type_wrapper_requires_two_generic_params,none,
66156615
"wrapped and storage types", ())
66166616

66176617
ERROR(cannot_use_multiple_type_wrappers,none,
6618-
"type %0 cannot use more than one type wrapper", ())
6618+
"%0 %1 cannot use more than one type wrapper",
6619+
(DescriptiveDeclKind, DeclName))
66196620

66206621
ERROR(type_wrapper_requires_memberwise_init,none,
66216622
"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)