Skip to content

Commit 40169c7

Browse files
committed
[CSDiagnostics] Add a diagnostic for an attempt to specialize a concrete type
Diagnose attempts to specialize a concrete type or its alias: ```swift struct Test {} typealias X = Test _ = X<Int>() // error ```
1 parent ab2f47b commit 40169c7

File tree

3 files changed

+27
-1
lines changed

3 files changed

+27
-1
lines changed

lib/Sema/CSDiagnostics.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9162,3 +9162,8 @@ bool InvalidMemberReferenceWithinInitAccessor::diagnoseAsError() {
91629162
emitDiagnostic(diag::init_accessor_invalid_member_ref, MemberName);
91639163
return true;
91649164
}
9165+
9166+
bool ConcreteTypeSpecialization::diagnoseAsError() {
9167+
emitDiagnostic(diag::not_a_generic_type, ConcreteType);
9168+
return true;
9169+
}

lib/Sema/CSDiagnostics.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3049,6 +3049,26 @@ class InvalidMemberReferenceWithinInitAccessor final
30493049
bool diagnoseAsError() override;
30503050
};
30513051

3052+
/// Diagnose attempts to specialize a concrete type or its alias:
3053+
///
3054+
/// \code
3055+
/// struct Test {}
3056+
/// typealias X = Test
3057+
///
3058+
/// _ = X<Int>() // error
3059+
/// \endcode
3060+
class ConcreteTypeSpecialization final : public FailureDiagnostic {
3061+
Type ConcreteType;
3062+
3063+
public:
3064+
ConcreteTypeSpecialization(const Solution &solution, Type concreteTy,
3065+
ConstraintLocator *locator)
3066+
: FailureDiagnostic(solution, locator),
3067+
ConcreteType(resolveType(concreteTy)) {}
3068+
3069+
bool diagnoseAsError() override;
3070+
};
3071+
30523072
} // end namespace constraints
30533073
} // end namespace swift
30543074

lib/Sema/CSFix.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2832,7 +2832,8 @@ AllowInvalidMemberReferenceInInitAccessor::create(ConstraintSystem &cs,
28322832

28332833
bool AllowConcreteTypeSpecialization::diagnose(const Solution &solution,
28342834
bool asNote) const {
2835-
return false;
2835+
ConcreteTypeSpecialization failure(solution, ConcreteType, getLocator());
2836+
return failure.diagnose(asNote);
28362837
}
28372838

28382839
AllowConcreteTypeSpecialization *

0 commit comments

Comments
 (0)