diff --git a/include/swift/AST/DiagnosticsSema.def b/include/swift/AST/DiagnosticsSema.def index f18ce60cf44a3..d531f2cfda845 100644 --- a/include/swift/AST/DiagnosticsSema.def +++ b/include/swift/AST/DiagnosticsSema.def @@ -98,6 +98,9 @@ ERROR(could_not_use_type_member,none, ERROR(could_not_use_type_member_on_instance,none, "static member %1 cannot be used on instance of type %0", (Type, DeclName)) +ERROR(could_not_use_type_member_on_instance_without_name,none, + "static member %0 cannot be referenced as an instance member", + (DeclName)) ERROR(could_not_use_enum_element_on_instance,none, "enum element %0 cannot be referenced as an instance member", (DeclName)) diff --git a/lib/Sema/CSDiag.cpp b/lib/Sema/CSDiag.cpp index bf8f627839cf9..7c8d9c7af1b04 100644 --- a/lib/Sema/CSDiag.cpp +++ b/lib/Sema/CSDiag.cpp @@ -1243,12 +1243,16 @@ diagnoseTypeMemberOnInstanceLookup(Type baseObjTy, return; } - if (isa(member)) + if (isa(member)) { Diag.emplace(diagnose(loc, diag::could_not_use_enum_element_on_instance, memberName)); - else + } else if (isa(baseExpr) || isa(baseExpr)) { + Diag.emplace(diagnose(loc, diag::could_not_use_type_member_on_instance_without_name, + memberName)); + } else { Diag.emplace(diagnose(loc, diag::could_not_use_type_member_on_instance, baseObjTy, memberName)); + } Diag->highlight(nameLoc.getSourceRange()); diff --git a/test/Constraints/members.swift b/test/Constraints/members.swift index 50347d9de7f9d..a2a37ff302c88 100644 --- a/test/Constraints/members.swift +++ b/test/Constraints/members.swift @@ -464,3 +464,11 @@ struct Outer { } } } + +struct HasStaticSR6207 { + func foo() { + print(cvar) // expected-error {{static element cvar cannot be referenced as an instance member}} + } + + static let cvar = 123 +}