diff --git a/include/swift/AST/DiagnosticGroups.def b/include/swift/AST/DiagnosticGroups.def index 1db991e120c75..99091eeb5cc40 100644 --- a/include/swift/AST/DiagnosticGroups.def +++ b/include/swift/AST/DiagnosticGroups.def @@ -79,5 +79,9 @@ GROUP(UnknownWarningGroup, "unknown-warning-group") GROUP(CompilationCaching, "compilation-caching") GROUP(WeakMutability, "weak-mutability") +GROUP(PerformanceHints, "performance-hints") +GROUP(ReturnTypeImplicitCopy, "return-type-implicit-copy") +GROUP_LINK(PerformanceHints, ReturnTypeImplicitCopy) + #define UNDEFINE_DIAGNOSTIC_GROUPS_MACROS #include "swift/AST/DefineDiagnosticGroupsMacros.h" diff --git a/include/swift/AST/DiagnosticsSema.def b/include/swift/AST/DiagnosticsSema.def index 7e7422b7195c0..e1d5e9242bc31 100644 --- a/include/swift/AST/DiagnosticsSema.def +++ b/include/swift/AST/DiagnosticsSema.def @@ -8935,5 +8935,16 @@ ERROR(attr_inline_always_requires_inlinable,none, ERROR(attr_inline_always_no_usable_from_inline,none, "cannot use '@inline(always)' together with '@usableFromInline'", ()) +//===----------------------------------------------------------------------===// +// MARK: Swift Performance hints +//===----------------------------------------------------------------------===// + +GROUPED_WARNING(perf_hint_function_returns_array,ReturnTypeImplicitCopy,DefaultIgnore, + "Performance: %0 returns a%select{ dictionary|n array}1, leading to implicit copies. " + "Consider using an 'inout' parameter instead.", (const FuncDecl *, bool)) +GROUPED_WARNING(perf_hint_closure_returns_array,ReturnTypeImplicitCopy,DefaultIgnore, + "Performance: closure returns a%select{ dictionary|n array}0, leading to implicit copies. " + "Consider using an 'inout' parameter instead.", (bool)) + #define UNDEFINE_DIAGNOSTIC_MACROS #include "DefineDiagnosticMacros.h" diff --git a/include/swift/AST/TypeCheckRequests.h b/include/swift/AST/TypeCheckRequests.h index ba830a721db8a..1d56c937eb950 100644 --- a/include/swift/AST/TypeCheckRequests.h +++ b/include/swift/AST/TypeCheckRequests.h @@ -4967,6 +4967,24 @@ class TypeCheckCDeclFunctionRequest bool isCached() const { return true; } }; +/// A request to emit performance hints +class EmitPerformanceHints +: public SimpleRequest { +public: +using SimpleRequest::SimpleRequest; + +private: +friend SimpleRequest; + +evaluator::SideEffect +evaluate(Evaluator &evaluator, SourceFile *SF) const; + +public: +bool isCached() const { return true; } +}; + /// Check @c enums for compatibility with C. class TypeCheckCDeclEnumRequest : public SimpleRequest