diff --git a/.clang-format b/.clang-format
new file mode 100644
index 0000000000..bdb82f2176
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,39 @@
+---
+# See all possible options and defaults with:
+# clang-format --style=Microsoft --dump-config
+BasedOnStyle: Microsoft
+Language: Cpp
+Standard: c++20
+AccessModifierOffset: -4
+AlwaysBreakTemplateDeclarations: Yes
+BinPackArguments: false
+BinPackParameters: false
+BreakBeforeBinaryOperators: All
+BreakConstructorInitializers: BeforeColon
+ColumnLimit: 0
+CommentPragmas: 'NOLINT:.*|^ IWYU pragma:'
+IncludeBlocks: Regroup
+IndentCaseLabels: true
+IndentPPDirectives: AfterHash
+# IndentWidth: 4
+SpaceAfterCStyleCast: true
+UseTab: Always
+AlignAfterOpenBracket: Align
+AlignConsecutiveAssignments: true
+AlignConsecutiveDeclarations: true
+AllowAllParametersOfDeclarationOnNextLine: false
+AllowShortFunctionsOnASingleLine: None
+AllowShortIfStatementsOnASingleLine: true
+AllowShortLoopsOnASingleLine: true
+AllowShortLambdasOnASingleLine: Inline
+AlwaysBreakAfterReturnType: None
+AlwaysBreakBeforeMultilineStrings: true
+BreakBeforeBraces: Allman
+DerivePointerAlignment: false
+KeepEmptyLinesAtTheStartOfBlocks: false
+NamespaceIndentation: None
+PointerAlignment: Left
+SpaceBeforeAssignmentOperators: true
+SpaceBeforeParens: ControlStatements
+SpaceInEmptyParentheses: false
+SpacesBeforeTrailingComments: 1
diff --git a/.clang-tidy b/.clang-tidy
new file mode 100644
index 0000000000..2ef1f22615
--- /dev/null
+++ b/.clang-tidy
@@ -0,0 +1,73 @@
+FormatStyle: file
+
+Checks: |
+ *bugprone*,
+ *performance*,
+ clang-analyzer-optin.cplusplus.VirtualCall,
+ clang-analyzer-optin.performance.Padding,
+ cppcoreguidelines-slicing,
+ google-explicit-constructor,
+ misc-definitions-in-headers,
+ misc-misplaced-const,
+ misc-non-copyable-objects,
+ misc-static-assert,
+ misc-throw-by-value-catch-by-reference,
+ misc-uniqueptr-reset-release,
+ modernize-avoid-bind,
+ modernize-loop-convert,
+ modernize-make-unique,
+ modernize-redundant-void-arg,
+ modernize-replace-auto-ptr,
+ modernize-replace-disallow-copy-and-assign-macro,
+ modernize-replace-random-shuffle,
+ modernize-shrink-to-fit,
+ modernize-use-auto,
+ modernize-use-bool-literals,
+ modernize-use-default-member-init,
+ modernize-use-emplace,
+ modernize-use-equals-default,
+ modernize-use-equals-delete,
+ modernize-use-noexcept,
+ modernize-use-nullptr,
+ modernize-use-using,
+ readability-avoid-const-params-in-decls,
+ readability-const-return-type,
+ readability-container-size-empty,
+ readability-delete-null-pointer,
+ readability-else-after-return,
+ readability-inconsistent-declaration-parameter-name,
+ readability-make-member-function-const,
+ readability-misplaced-array-index,
+ readability-non-const-parameter,
+ readability-qualified-auto,
+ readability-redundant-function-ptr-dereference,
+ readability-redundant-smartptr-get,
+ readability-redundant-string-cstr,
+ readability-simplify-subscript-expr,
+ readability-static-accessed-through-instance,
+ readability-static-definition-in-anonymous-namespace,
+ readability-string-compare,
+ readability-suspicious-call-argument,
+ readability-uniqueptr-delete-release,
+ -bugprone-easily-swappable-parameters,
+ -bugprone-exception-escape,
+ -bugprone-reserved-identifier,
+ -bugprone-unused-raii,
+
+CheckOptions:
+- key: modernize-use-equals-default.IgnoreMacros
+ value: false
+- key: performance-for-range-copy.WarnOnAllAutoCopies
+ value: true
+- key: performance-inefficient-string-concatenation.StrictMode
+ value: true
+- key: performance-unnecessary-value-param.AllowedTypes
+ value: 'exception_ptr$;'
+- key: readability-implicit-bool-conversion.AllowPointerConditions
+ value: true
+- key: readability-implicit-bool-conversion.AllowIntegerConditions
+ value: true
+- key: readability-braces-around-statements.ShortStatementLines
+ value: 2
+
+# HeaderFilterRegex:
diff --git a/.github/workflows/clang-format-check.yml b/.github/workflows/clang-format-check.yml
new file mode 100644
index 0000000000..5759f1404e
--- /dev/null
+++ b/.github/workflows/clang-format-check.yml
@@ -0,0 +1,27 @@
+name: clang-format Check
+on:
+ pull_request:
+ push:
+ branches:
+ - clang-format
+ # - develop
+jobs:
+ formatting-check:
+ name: Formatting Check
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ path:
+ - check: 'src'
+ exclude: '(Dummy|Sample|Coroutine)'
+ # - check: 'docs'
+ # exclude: ''
+ steps:
+ - uses: actions/checkout@v3
+ - name: Run clang-format style check for C/C++/Protobuf programs.
+ uses: jidicula/clang-format-action@v4.11.0
+ with:
+ clang-format-version: '13'
+ check-path: ${{ matrix.path['check'] }}
+ exclude-regex: ${{ matrix.path['exclude'] }}
+ fallback-style: 'Mozilla'
diff --git a/Phobos.vcxproj b/Phobos.vcxproj
index 7cd780d98d..4c4df78aff 100644
--- a/Phobos.vcxproj
+++ b/Phobos.vcxproj
@@ -317,6 +317,8 @@
false
$(Configuration)\
$(Configuration)\IntDir\
+ true
+ -clang-diagnostic-pragma-once-outside-header
false
@@ -324,6 +326,8 @@
false
$(Configuration)\
$(Configuration)\IntDir\
+ true
+ -clang-diagnostic-pragma-once-outside-header
false
@@ -331,6 +335,8 @@
false
$(Configuration)\
$(Configuration)\IntDir\
+ true
+ -clang-diagnostic-pragma-once-outside-header
@@ -356,7 +362,7 @@
$(IntDir)\%(RelativeDir)
StdCall
%(AdditionalOptions)
- 4100;4201;4530;4731;4740;4458;4819;5103;5105
+ 4100;4201;4530;4731;4740;4458;4819;5103;5105;26495;
true
true
@@ -400,7 +406,7 @@
$(IntDir)\%(RelativeDir)
StdCall
%(AdditionalOptions)
- 4100;4201;4530;4731;4740;4458;4819;5103;5105
+ 4100;4201;4530;4731;4740;4458;4819;5103;5105;26495;
true
true
true
@@ -443,7 +449,7 @@
$(IntDir)\%(RelativeDir)
StdCall
%(AdditionalOptions)
- 4100;4201;4530;4731;4740;4458;4819;5103;5105;26495
+ 4100;4201;4530;4731;4740;4458;4819;5103;5105;26495;26495
true
true
true