Condense namespaces in tint/sem.

This PR condenses the namespaces in the tint/sem folder.

Change-Id: Iff802ca78d4cb7fd21134a640dfe5d04e85148b4
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/86030
Commit-Queue: Dan Sinclair <dsinclair@chromium.org>
Auto-Submit: Dan Sinclair <dsinclair@chromium.org>
Reviewed-by: Ben Clayton <bclayton@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
diff --git a/src/tint/sem/array.cc b/src/tint/sem/array.cc
index ff486a5..296979c 100644
--- a/src/tint/sem/array.cc
+++ b/src/tint/sem/array.cc
@@ -21,8 +21,7 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::Array);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 Array::Array(const Type* element,
              uint32_t count,
@@ -81,5 +80,4 @@
   return size_;
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/array.h b/src/tint/sem/array.h
index b6639fe..e10777b 100644
--- a/src/tint/sem/array.h
+++ b/src/tint/sem/array.h
@@ -22,14 +22,11 @@
 #include "src/tint/sem/type.h"
 
 // Forward declarations
-namespace tint {
-namespace ast {
+namespace tint::ast {
 class Array;
-}  // namespace ast
-}  // namespace tint
+}  // namespace tint::ast
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// Array holds the semantic information for Array nodes.
 class Array final : public Castable<Array, Type> {
@@ -111,7 +108,6 @@
   const bool constructible_;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_ARRAY_H_
diff --git a/src/tint/sem/atomic_type.cc b/src/tint/sem/atomic_type.cc
index b806039..6376a7b 100644
--- a/src/tint/sem/atomic_type.cc
+++ b/src/tint/sem/atomic_type.cc
@@ -20,8 +20,7 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::Atomic);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 Atomic::Atomic(const sem::Type* subtype) : subtype_(subtype) {
   TINT_ASSERT(AST, !subtype->Is<Reference>());
@@ -60,5 +59,4 @@
 
 Atomic::~Atomic() = default;
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/atomic_type.h b/src/tint/sem/atomic_type.h
index 20035ec..e0dcb15 100644
--- a/src/tint/sem/atomic_type.h
+++ b/src/tint/sem/atomic_type.h
@@ -19,8 +19,7 @@
 
 #include "src/tint/sem/type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// A atomic type.
 class Atomic final : public Castable<Atomic, Type> {
@@ -62,7 +61,6 @@
   sem::Type const* const subtype_;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_ATOMIC_TYPE_H_
diff --git a/src/tint/sem/atomic_type_test.cc b/src/tint/sem/atomic_type_test.cc
index 0132233..15aa484 100644
--- a/src/tint/sem/atomic_type_test.cc
+++ b/src/tint/sem/atomic_type_test.cc
@@ -16,8 +16,7 @@
 
 #include "src/tint/sem/test_helper.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 namespace {
 
 using AtomicTest = TestHelper;
@@ -54,5 +53,4 @@
 }
 
 }  // namespace
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/behavior.cc b/src/tint/sem/behavior.cc
index a443d33..628aa60 100644
--- a/src/tint/sem/behavior.cc
+++ b/src/tint/sem/behavior.cc
@@ -14,8 +14,7 @@
 
 #include "src/tint/sem/behavior.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 std::ostream& operator<<(std::ostream& out, Behavior behavior) {
   switch (behavior) {
@@ -35,5 +34,4 @@
   return out << "<unknown>";
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/behavior.h b/src/tint/sem/behavior.h
index f921080..e8d158d 100644
--- a/src/tint/sem/behavior.h
+++ b/src/tint/sem/behavior.h
@@ -17,8 +17,7 @@
 
 #include "src/tint/utils/enum_set.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// Behavior enumerates the possible behaviors of an expression or statement.
 /// @see https://www.w3.org/TR/WGSL/#behaviors
@@ -40,7 +39,6 @@
 /// @returns out so calls can be chained
 std::ostream& operator<<(std::ostream& out, Behavior behavior);
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_BEHAVIOR_H_
diff --git a/src/tint/sem/binding_point.h b/src/tint/sem/binding_point.h
index 3f6d307..8e8c6c7 100644
--- a/src/tint/sem/binding_point.h
+++ b/src/tint/sem/binding_point.h
@@ -21,8 +21,7 @@
 
 #include "src/tint/utils/hash.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// BindingPoint holds a group and binding index.
 struct BindingPoint {
@@ -46,8 +45,7 @@
   }
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 namespace std {
 
diff --git a/src/tint/sem/block_statement.cc b/src/tint/sem/block_statement.cc
index fe2bac2..7074483 100644
--- a/src/tint/sem/block_statement.cc
+++ b/src/tint/sem/block_statement.cc
@@ -22,8 +22,7 @@
 TINT_INSTANTIATE_TYPEINFO(tint::sem::FunctionBlockStatement);
 TINT_INSTANTIATE_TYPEINFO(tint::sem::LoopBlockStatement);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 BlockStatement::BlockStatement(const ast::BlockStatement* declaration,
                                const CompoundStatement* parent,
@@ -63,5 +62,4 @@
   num_decls_at_first_continue_ = num_decls;
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/block_statement.h b/src/tint/sem/block_statement.h
index c6e537f..6b71baf 100644
--- a/src/tint/sem/block_statement.h
+++ b/src/tint/sem/block_statement.h
@@ -21,17 +21,14 @@
 #include "src/tint/sem/statement.h"
 
 // Forward declarations
-namespace tint {
-namespace ast {
+namespace tint::ast {
 class BlockStatement;
 class ContinueStatement;
 class Function;
 class Variable;
-}  // namespace ast
-}  // namespace tint
+}  // namespace tint::ast
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// Holds semantic information about a block, such as parent block and variables
 /// declared in the block.
@@ -117,7 +114,6 @@
   size_t num_decls_at_first_continue_ = 0;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_BLOCK_STATEMENT_H_
diff --git a/src/tint/sem/bool_type.cc b/src/tint/sem/bool_type.cc
index d42f687..7a20768 100644
--- a/src/tint/sem/bool_type.cc
+++ b/src/tint/sem/bool_type.cc
@@ -18,8 +18,7 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::Bool);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 Bool::Bool() = default;
 
@@ -51,5 +50,4 @@
   return 4;
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/bool_type.h b/src/tint/sem/bool_type.h
index 7e53e88..9e949bd 100644
--- a/src/tint/sem/bool_type.h
+++ b/src/tint/sem/bool_type.h
@@ -25,8 +25,7 @@
 #undef Bool
 #endif
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// A boolean type
 class Bool final : public Castable<Bool, Type> {
@@ -64,7 +63,6 @@
   uint32_t Align() const override;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_BOOL_TYPE_H_
diff --git a/src/tint/sem/bool_type_test.cc b/src/tint/sem/bool_type_test.cc
index eb6d1e9..390de43 100644
--- a/src/tint/sem/bool_type_test.cc
+++ b/src/tint/sem/bool_type_test.cc
@@ -15,8 +15,7 @@
 #include "src/tint/sem/test_helper.h"
 #include "src/tint/sem/texture_type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 namespace {
 
 using BoolTest = TestHelper;
@@ -46,5 +45,4 @@
 }
 
 }  // namespace
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/builtin.cc b/src/tint/sem/builtin.cc
index 02533f4..a822be5 100644
--- a/src/tint/sem/builtin.cc
+++ b/src/tint/sem/builtin.cc
@@ -23,8 +23,7 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::Builtin);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 const char* Builtin::str() const {
   return sem::str(type_);
@@ -161,7 +160,6 @@
   return false;
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 //! @endcond
diff --git a/src/tint/sem/builtin.h b/src/tint/sem/builtin.h
index bb216ac..61589ee 100644
--- a/src/tint/sem/builtin.h
+++ b/src/tint/sem/builtin.h
@@ -23,8 +23,7 @@
 #include "src/tint/sem/pipeline_stage_set.h"
 #include "src/tint/utils/hash.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// Determines if the given `i` is a coarse derivative
 /// @param i the builtin type
@@ -147,8 +146,7 @@
 /// Constant value used by the radians() builtin
 static constexpr double kDegToRad = 0.017453292519943295474;
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 namespace std {
 
diff --git a/src/tint/sem/builtin_test.cc b/src/tint/sem/builtin_test.cc
index 385451b..d931bcf 100644
--- a/src/tint/sem/builtin_test.cc
+++ b/src/tint/sem/builtin_test.cc
@@ -16,8 +16,7 @@
 
 #include "gtest/gtest.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 namespace {
 
 struct BuiltinData {
@@ -124,5 +123,4 @@
 }
 
 }  // namespace
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/builtin_type.cc b/src/tint/sem/builtin_type.cc
index 55418a7..eb22a2f 100644
--- a/src/tint/sem/builtin_type.cc
+++ b/src/tint/sem/builtin_type.cc
@@ -26,8 +26,7 @@
 
 #include <sstream>
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 BuiltinType ParseBuiltinType(const std::string& name) {
   if (name == "abs") {
@@ -571,5 +570,4 @@
   return out;
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/builtin_type.cc.tmpl b/src/tint/sem/builtin_type.cc.tmpl
index 0a44d0e..ab072d9 100644
--- a/src/tint/sem/builtin_type.cc.tmpl
+++ b/src/tint/sem/builtin_type.cc.tmpl
@@ -12,8 +12,7 @@
 
 #include <sstream>
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 BuiltinType ParseBuiltinType(const std::string& name) {
 {{- range .Sem.Functions  }}
@@ -41,5 +40,4 @@
   return out;
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/builtin_type.h b/src/tint/sem/builtin_type.h
index 98e5b57..e2d741f 100644
--- a/src/tint/sem/builtin_type.h
+++ b/src/tint/sem/builtin_type.h
@@ -28,8 +28,7 @@
 #include <sstream>
 #include <string>
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// Enumerator of all builtin functions
 enum class BuiltinType {
@@ -155,7 +154,6 @@
 /// matches the name in the WGSL spec.
 std::ostream& operator<<(std::ostream& out, BuiltinType i);
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_BUILTIN_TYPE_H_
diff --git a/src/tint/sem/builtin_type.h.tmpl b/src/tint/sem/builtin_type.h.tmpl
index 135ed0d..7b018df 100644
--- a/src/tint/sem/builtin_type.h.tmpl
+++ b/src/tint/sem/builtin_type.h.tmpl
@@ -14,8 +14,7 @@
 #include <sstream>
 #include <string>
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// Enumerator of all builtin functions
 enum class BuiltinType {
@@ -39,7 +38,6 @@
 /// matches the name in the WGSL spec.
 std::ostream& operator<<(std::ostream& out, BuiltinType i);
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_BUILTIN_TYPE_H_
diff --git a/src/tint/sem/call.cc b/src/tint/sem/call.cc
index 682c802..415316e 100644
--- a/src/tint/sem/call.cc
+++ b/src/tint/sem/call.cc
@@ -19,8 +19,7 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::Call);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 Call::Call(const ast::CallExpression* declaration,
            const CallTarget* target,
@@ -38,5 +37,4 @@
 
 Call::~Call() = default;
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/call.h b/src/tint/sem/call.h
index fad6db3..786bd25 100644
--- a/src/tint/sem/call.h
+++ b/src/tint/sem/call.h
@@ -20,8 +20,7 @@
 #include "src/tint/sem/builtin.h"
 #include "src/tint/sem/expression.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// Call is the base class for semantic nodes that hold semantic information for
 /// ast::CallExpression nodes.
@@ -62,7 +61,6 @@
   std::vector<const sem::Expression*> arguments_;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_CALL_H_
diff --git a/src/tint/sem/call_target.cc b/src/tint/sem/call_target.cc
index 3e1264d..7fc3c81 100644
--- a/src/tint/sem/call_target.cc
+++ b/src/tint/sem/call_target.cc
@@ -19,8 +19,7 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::CallTarget);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 CallTarget::CallTarget(const sem::Type* return_type,
                        const ParameterList& parameters)
@@ -61,8 +60,7 @@
   return true;
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 namespace std {
 
diff --git a/src/tint/sem/call_target.h b/src/tint/sem/call_target.h
index 8faa099..1671899 100644
--- a/src/tint/sem/call_target.h
+++ b/src/tint/sem/call_target.h
@@ -22,10 +22,12 @@
 #include "src/tint/sem/variable.h"
 #include "src/tint/utils/hash.h"
 
-namespace tint {
-namespace sem {
 // Forward declarations
+namespace tint::sem {
 class Type;
+}
+
+namespace tint::sem {
 
 /// CallTargetSignature holds the return type and parameters for a call target
 struct CallTargetSignature {
@@ -84,8 +86,7 @@
   CallTargetSignature signature_;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 namespace std {
 
diff --git a/src/tint/sem/constant.cc b/src/tint/sem/constant.cc
index 8b54b0e..3b23d05 100644
--- a/src/tint/sem/constant.cc
+++ b/src/tint/sem/constant.cc
@@ -21,8 +21,7 @@
 #include "src/tint/program_builder.h"
 #include "src/tint/sem/type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 namespace {
 
@@ -80,5 +79,4 @@
   return false;
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/constant.h b/src/tint/sem/constant.h
index 363fe93..cfb6f1e 100644
--- a/src/tint/sem/constant.h
+++ b/src/tint/sem/constant.h
@@ -20,8 +20,7 @@
 #include "src/tint/program_builder.h"
 #include "src/tint/sem/type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// A Constant is compile-time known expression value, expressed as a flattened
 /// list of scalar values. Value may be of a scalar or vector type.
@@ -139,7 +138,6 @@
   Scalars elems_;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_CONSTANT_H_
diff --git a/src/tint/sem/depth_multisampled_texture_type.cc b/src/tint/sem/depth_multisampled_texture_type.cc
index 4e2f34c..bb5b8a7 100644
--- a/src/tint/sem/depth_multisampled_texture_type.cc
+++ b/src/tint/sem/depth_multisampled_texture_type.cc
@@ -19,8 +19,7 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::DepthMultisampledTexture);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 namespace {
 
 bool IsValidDepthDimension(ast::TextureDimension dim) {
@@ -57,5 +56,4 @@
   return out.str();
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/depth_multisampled_texture_type.h b/src/tint/sem/depth_multisampled_texture_type.h
index f2eff66..de23417 100644
--- a/src/tint/sem/depth_multisampled_texture_type.h
+++ b/src/tint/sem/depth_multisampled_texture_type.h
@@ -19,8 +19,7 @@
 
 #include "src/tint/sem/texture_type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// A multisampled depth texture type.
 class DepthMultisampledTexture final
@@ -46,7 +45,6 @@
   std::string FriendlyName(const SymbolTable& symbols) const override;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_DEPTH_MULTISAMPLED_TEXTURE_TYPE_H_
diff --git a/src/tint/sem/depth_multisampled_texture_type_test.cc b/src/tint/sem/depth_multisampled_texture_type_test.cc
index a8264e6..ea92986 100644
--- a/src/tint/sem/depth_multisampled_texture_type_test.cc
+++ b/src/tint/sem/depth_multisampled_texture_type_test.cc
@@ -20,8 +20,7 @@
 #include "src/tint/sem/sampled_texture_type.h"
 #include "src/tint/sem/storage_texture_type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 namespace {
 
 using DepthMultisampledTextureTest = TestHelper;
@@ -60,5 +59,4 @@
 }
 
 }  // namespace
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/depth_texture_type.cc b/src/tint/sem/depth_texture_type.cc
index ec8d85f..1ff0060 100644
--- a/src/tint/sem/depth_texture_type.cc
+++ b/src/tint/sem/depth_texture_type.cc
@@ -19,8 +19,7 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::DepthTexture);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 namespace {
 
 bool IsValidDepthDimension(ast::TextureDimension dim) {
@@ -57,5 +56,4 @@
   return out.str();
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/depth_texture_type.h b/src/tint/sem/depth_texture_type.h
index 657c4b6..0f25785 100644
--- a/src/tint/sem/depth_texture_type.h
+++ b/src/tint/sem/depth_texture_type.h
@@ -19,8 +19,7 @@
 
 #include "src/tint/sem/texture_type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// A depth texture type.
 class DepthTexture final : public Castable<DepthTexture, Texture> {
@@ -45,7 +44,6 @@
   std::string FriendlyName(const SymbolTable& symbols) const override;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_DEPTH_TEXTURE_TYPE_H_
diff --git a/src/tint/sem/depth_texture_type_test.cc b/src/tint/sem/depth_texture_type_test.cc
index 17db4c4..28bb84a 100644
--- a/src/tint/sem/depth_texture_type_test.cc
+++ b/src/tint/sem/depth_texture_type_test.cc
@@ -20,8 +20,7 @@
 #include "src/tint/sem/sampled_texture_type.h"
 #include "src/tint/sem/storage_texture_type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 namespace {
 
 using DepthTextureTest = TestHelper;
@@ -74,5 +73,4 @@
 }
 
 }  // namespace
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/expression.cc b/src/tint/sem/expression.cc
index 774ac62..a5f2b1bb 100644
--- a/src/tint/sem/expression.cc
+++ b/src/tint/sem/expression.cc
@@ -18,8 +18,7 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::Expression);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 Expression::Expression(const ast::Expression* declaration,
                        const sem::Type* type,
@@ -36,5 +35,4 @@
 
 Expression::~Expression() = default;
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/expression.h b/src/tint/sem/expression.h
index 85640b1..23eae1b 100644
--- a/src/tint/sem/expression.h
+++ b/src/tint/sem/expression.h
@@ -20,12 +20,13 @@
 #include "src/tint/sem/constant.h"
 #include "src/tint/sem/node.h"
 
-namespace tint {
-namespace sem {
 // Forward declarations
+namespace tint::sem {
 class Statement;
 class Type;
+}  // namespace tint::sem
 
+namespace tint::sem {
 /// Expression holds the semantic information for expression nodes.
 class Expression : public Castable<Expression, Node> {
  public:
@@ -77,7 +78,6 @@
   const bool has_side_effects_;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_EXPRESSION_H_
diff --git a/src/tint/sem/external_texture_type.cc b/src/tint/sem/external_texture_type.cc
index 885bbae..adfd373 100644
--- a/src/tint/sem/external_texture_type.cc
+++ b/src/tint/sem/external_texture_type.cc
@@ -18,8 +18,7 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::ExternalTexture);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 ExternalTexture::ExternalTexture() : Base(ast::TextureDimension::k2d) {}
 
@@ -39,5 +38,4 @@
   return "texture_external";
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/external_texture_type.h b/src/tint/sem/external_texture_type.h
index 2406c08..4a07005 100644
--- a/src/tint/sem/external_texture_type.h
+++ b/src/tint/sem/external_texture_type.h
@@ -19,8 +19,7 @@
 
 #include "src/tint/sem/texture_type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// An external texture type
 class ExternalTexture final : public Castable<ExternalTexture, Texture> {
@@ -45,7 +44,6 @@
   std::string FriendlyName(const SymbolTable& symbols) const override;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_EXTERNAL_TEXTURE_TYPE_H_
diff --git a/src/tint/sem/external_texture_type_test.cc b/src/tint/sem/external_texture_type_test.cc
index b2af740..439b3bc 100644
--- a/src/tint/sem/external_texture_type_test.cc
+++ b/src/tint/sem/external_texture_type_test.cc
@@ -20,8 +20,7 @@
 #include "src/tint/sem/storage_texture_type.h"
 #include "src/tint/sem/test_helper.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 namespace {
 
 using ExternalTextureTest = TestHelper;
@@ -68,5 +67,4 @@
 }
 
 }  // namespace
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/f32_type.cc b/src/tint/sem/f32_type.cc
index 2e666d5..c5b013e 100644
--- a/src/tint/sem/f32_type.cc
+++ b/src/tint/sem/f32_type.cc
@@ -18,8 +18,7 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::F32);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 F32::F32() = default;
 
@@ -51,5 +50,4 @@
   return 4;
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/f32_type.h b/src/tint/sem/f32_type.h
index c239c16..0d0fabf 100644
--- a/src/tint/sem/f32_type.h
+++ b/src/tint/sem/f32_type.h
@@ -19,8 +19,7 @@
 
 #include "src/tint/sem/type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// A float 32 type
 class F32 final : public Castable<F32, Type> {
@@ -54,7 +53,6 @@
   uint32_t Align() const override;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_F32_TYPE_H_
diff --git a/src/tint/sem/f32_type_test.cc b/src/tint/sem/f32_type_test.cc
index 24acd64..7fd7b76 100644
--- a/src/tint/sem/f32_type_test.cc
+++ b/src/tint/sem/f32_type_test.cc
@@ -15,8 +15,7 @@
 #include "src/tint/sem/test_helper.h"
 #include "src/tint/sem/texture_type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 namespace {
 
 using F32Test = TestHelper;
@@ -46,5 +45,4 @@
 }
 
 }  // namespace
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/for_loop_statement.cc b/src/tint/sem/for_loop_statement.cc
index 4321a14..5599633 100644
--- a/src/tint/sem/for_loop_statement.cc
+++ b/src/tint/sem/for_loop_statement.cc
@@ -18,8 +18,7 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::ForLoopStatement);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 ForLoopStatement::ForLoopStatement(const ast::ForLoopStatement* declaration,
                                    const CompoundStatement* parent,
@@ -32,5 +31,4 @@
   return static_cast<const ast::ForLoopStatement*>(Base::Declaration());
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/for_loop_statement.h b/src/tint/sem/for_loop_statement.h
index 7f8321b..0142d28 100644
--- a/src/tint/sem/for_loop_statement.h
+++ b/src/tint/sem/for_loop_statement.h
@@ -17,17 +17,17 @@
 
 #include "src/tint/sem/statement.h"
 
+// Forward Declarations
 namespace tint {
 namespace ast {
 class ForLoopStatement;
-}  // namespace ast
+}
 namespace sem {
 class Expression;
-}  // namespace sem
+}
 }  // namespace tint
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// Holds semantic information about a for-loop statement
 class ForLoopStatement final
@@ -58,7 +58,6 @@
   const Expression* condition_ = nullptr;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_FOR_LOOP_STATEMENT_H_
diff --git a/src/tint/sem/function.cc b/src/tint/sem/function.cc
index 83ba6f8..4ffda9a 100644
--- a/src/tint/sem/function.cc
+++ b/src/tint/sem/function.cc
@@ -25,8 +25,7 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::Function);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 Function::Function(const ast::Function* declaration,
                    Type* return_type,
@@ -38,7 +37,7 @@
   for (auto* parameter : parameters) {
     parameter->SetOwner(this);
   }
-}  // namespace sem
+}
 
 Function::~Function() = default;
 
@@ -193,5 +192,4 @@
   return ret;
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/function.h b/src/tint/sem/function.h
index 6e34356..f8854e0 100644
--- a/src/tint/sem/function.h
+++ b/src/tint/sem/function.h
@@ -23,20 +23,21 @@
 #include "src/tint/sem/call.h"
 #include "src/tint/utils/unique_vector.h"
 
-namespace tint {
-
 // Forward declarations
+namespace tint {
 namespace ast {
 class BuiltinAttribute;
 class Function;
 class LocationAttribute;
 class ReturnStatement;
 }  // namespace ast
-
 namespace sem {
-
 class Builtin;
 class Variable;
+}  // namespace sem
+}  // namespace tint
+
+namespace tint::sem {
 
 /// WorkgroupDimension describes the size of a single dimension of an entry
 /// point's workgroup size.
@@ -283,7 +284,6 @@
   sem::Behaviors behaviors_{sem::Behavior::kNext};
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_FUNCTION_H_
diff --git a/src/tint/sem/i32_type.cc b/src/tint/sem/i32_type.cc
index 47cd5a6..0865c03 100644
--- a/src/tint/sem/i32_type.cc
+++ b/src/tint/sem/i32_type.cc
@@ -18,8 +18,7 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::I32);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 I32::I32() = default;
 
@@ -51,5 +50,4 @@
   return 4;
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/i32_type.h b/src/tint/sem/i32_type.h
index 6a28f8f..f6747a2 100644
--- a/src/tint/sem/i32_type.h
+++ b/src/tint/sem/i32_type.h
@@ -19,8 +19,7 @@
 
 #include "src/tint/sem/type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// A signed int 32 type.
 class I32 final : public Castable<I32, Type> {
@@ -54,7 +53,6 @@
   uint32_t Align() const override;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_I32_TYPE_H_
diff --git a/src/tint/sem/i32_type_test.cc b/src/tint/sem/i32_type_test.cc
index ab73a8d..679331a 100644
--- a/src/tint/sem/i32_type_test.cc
+++ b/src/tint/sem/i32_type_test.cc
@@ -15,8 +15,7 @@
 #include "src/tint/sem/test_helper.h"
 #include "src/tint/sem/texture_type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 namespace {
 
 using I32Test = TestHelper;
@@ -46,5 +45,4 @@
 }
 
 }  // namespace
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/if_statement.cc b/src/tint/sem/if_statement.cc
index 38a7395..5102b89 100644
--- a/src/tint/sem/if_statement.cc
+++ b/src/tint/sem/if_statement.cc
@@ -19,8 +19,7 @@
 TINT_INSTANTIATE_TYPEINFO(tint::sem::IfStatement);
 TINT_INSTANTIATE_TYPEINFO(tint::sem::ElseStatement);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 IfStatement::IfStatement(const ast::IfStatement* declaration,
                          const CompoundStatement* parent,
@@ -44,5 +43,4 @@
   return static_cast<const ast::ElseStatement*>(Base::Declaration());
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/if_statement.h b/src/tint/sem/if_statement.h
index c38a32a..6e11d52 100644
--- a/src/tint/sem/if_statement.h
+++ b/src/tint/sem/if_statement.h
@@ -25,11 +25,10 @@
 }  // namespace ast
 namespace sem {
 class Expression;
-}  // namespace sem
+}
 }  // namespace tint
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// Holds semantic information about an if statement
 class IfStatement final : public Castable<IfStatement, CompoundStatement> {
@@ -92,7 +91,6 @@
   const Expression* condition_ = nullptr;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_IF_STATEMENT_H_
diff --git a/src/tint/sem/info.cc b/src/tint/sem/info.cc
index f839d8a..edeab7e 100644
--- a/src/tint/sem/info.cc
+++ b/src/tint/sem/info.cc
@@ -14,8 +14,7 @@
 
 #include "src/tint/sem/info.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 Info::Info() = default;
 
@@ -25,5 +24,4 @@
 
 Info& Info::operator=(Info&&) = default;
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/info.h b/src/tint/sem/info.h
index ccc31bd..8502269 100644
--- a/src/tint/sem/info.h
+++ b/src/tint/sem/info.h
@@ -22,10 +22,12 @@
 #include "src/tint/sem/node.h"
 #include "src/tint/sem/type_mappings.h"
 
-namespace tint::sem {
-
 // Forward declarations
+namespace tint::sem {
 class Module;
+}
+
+namespace tint::sem {
 
 /// Info holds all the resolved semantic information for a Program.
 class Info {
diff --git a/src/tint/sem/loop_statement.cc b/src/tint/sem/loop_statement.cc
index 4be6e058..a26bf9e 100644
--- a/src/tint/sem/loop_statement.cc
+++ b/src/tint/sem/loop_statement.cc
@@ -19,8 +19,7 @@
 TINT_INSTANTIATE_TYPEINFO(tint::sem::LoopStatement);
 TINT_INSTANTIATE_TYPEINFO(tint::sem::LoopContinuingBlockStatement);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 LoopStatement::LoopStatement(const ast::LoopStatement* declaration,
                              const CompoundStatement* parent,
@@ -42,5 +41,4 @@
 }
 LoopContinuingBlockStatement::~LoopContinuingBlockStatement() = default;
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/loop_statement.h b/src/tint/sem/loop_statement.h
index 23ca4d3..0c8edd9 100644
--- a/src/tint/sem/loop_statement.h
+++ b/src/tint/sem/loop_statement.h
@@ -18,14 +18,11 @@
 #include "src/tint/sem/block_statement.h"
 
 // Forward declarations
-namespace tint {
-namespace ast {
+namespace tint::ast {
 class LoopStatement;
-}  // namespace ast
-}  // namespace tint
+}
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// Holds semantic information about a loop statement
 class LoopStatement final : public Castable<LoopStatement, CompoundStatement> {
@@ -58,7 +55,6 @@
   ~LoopContinuingBlockStatement() override;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_LOOP_STATEMENT_H_
diff --git a/src/tint/sem/matrix_type.cc b/src/tint/sem/matrix_type.cc
index e043368..cfd9c1c 100644
--- a/src/tint/sem/matrix_type.cc
+++ b/src/tint/sem/matrix_type.cc
@@ -20,8 +20,7 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::Matrix);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 Matrix::Matrix(const Vector* column_type, uint32_t columns)
     : subtype_(column_type->type()),
@@ -74,5 +73,4 @@
   return column_type_->Align();
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/matrix_type.h b/src/tint/sem/matrix_type.h
index 888a7af..809c6f3 100644
--- a/src/tint/sem/matrix_type.h
+++ b/src/tint/sem/matrix_type.h
@@ -19,11 +19,12 @@
 
 #include "src/tint/sem/type.h"
 
-namespace tint {
-namespace sem {
-
 // Forward declaration
+namespace tint::sem {
 class Vector;
+}
+
+namespace tint::sem {
 
 /// A matrix type
 class Matrix final : public Castable<Matrix, Type> {
@@ -79,7 +80,6 @@
   const uint32_t columns_;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_MATRIX_TYPE_H_
diff --git a/src/tint/sem/matrix_type_test.cc b/src/tint/sem/matrix_type_test.cc
index 59688ca..52ae36b 100644
--- a/src/tint/sem/matrix_type_test.cc
+++ b/src/tint/sem/matrix_type_test.cc
@@ -15,8 +15,7 @@
 #include "src/tint/sem/test_helper.h"
 #include "src/tint/sem/texture_type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 namespace {
 
 using MatrixTest = TestHelper;
@@ -73,5 +72,4 @@
 }
 
 }  // namespace
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/member_accessor_expression.cc b/src/tint/sem/member_accessor_expression.cc
index 53b1402c9..4e04ab4 100644
--- a/src/tint/sem/member_accessor_expression.cc
+++ b/src/tint/sem/member_accessor_expression.cc
@@ -21,8 +21,7 @@
 TINT_INSTANTIATE_TYPEINFO(tint::sem::StructMemberAccess);
 TINT_INSTANTIATE_TYPEINFO(tint::sem::Swizzle);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 MemberAccessorExpression::MemberAccessorExpression(
     const ast::MemberAccessorExpression* declaration,
@@ -53,5 +52,4 @@
 
 Swizzle::~Swizzle() = default;
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/member_accessor_expression.h b/src/tint/sem/member_accessor_expression.h
index 9eed53b..cca1a43 100644
--- a/src/tint/sem/member_accessor_expression.h
+++ b/src/tint/sem/member_accessor_expression.h
@@ -19,18 +19,18 @@
 
 #include "src/tint/sem/expression.h"
 
-namespace tint {
-
 /// Forward declarations
+namespace tint {
 namespace ast {
 class MemberAccessorExpression;
 }  // namespace ast
-
 namespace sem {
-
-/// Forward declarations
 class Struct;
 class StructMember;
+}  // namespace sem
+}  // namespace tint
+
+namespace tint::sem {
 
 /// MemberAccessorExpression holds the semantic information for a
 /// ast::MemberAccessorExpression node.
@@ -105,7 +105,6 @@
   std::vector<uint32_t> const indices_;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_MEMBER_ACCESSOR_EXPRESSION_H_
diff --git a/src/tint/sem/multisampled_texture_type.cc b/src/tint/sem/multisampled_texture_type.cc
index 7552850..72ce2f5 100644
--- a/src/tint/sem/multisampled_texture_type.cc
+++ b/src/tint/sem/multisampled_texture_type.cc
@@ -19,8 +19,7 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::MultisampledTexture);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 MultisampledTexture::MultisampledTexture(ast::TextureDimension dim,
                                          const Type* type)
@@ -52,5 +51,4 @@
   return out.str();
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/multisampled_texture_type.h b/src/tint/sem/multisampled_texture_type.h
index 1e1ee05..0e993ec 100644
--- a/src/tint/sem/multisampled_texture_type.h
+++ b/src/tint/sem/multisampled_texture_type.h
@@ -19,8 +19,7 @@
 
 #include "src/tint/sem/texture_type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// A multisampled texture type.
 class MultisampledTexture final
@@ -53,7 +52,6 @@
   const Type* const type_;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_MULTISAMPLED_TEXTURE_TYPE_H_
diff --git a/src/tint/sem/multisampled_texture_type_test.cc b/src/tint/sem/multisampled_texture_type_test.cc
index 3cd8ac0..eb53ccd 100644
--- a/src/tint/sem/multisampled_texture_type_test.cc
+++ b/src/tint/sem/multisampled_texture_type_test.cc
@@ -20,8 +20,7 @@
 #include "src/tint/sem/storage_texture_type.h"
 #include "src/tint/sem/test_helper.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 namespace {
 
 using MultisampledTextureTest = TestHelper;
@@ -99,5 +98,4 @@
 }
 
 }  // namespace
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/node.cc b/src/tint/sem/node.cc
index 3a61890..d069797 100644
--- a/src/tint/sem/node.cc
+++ b/src/tint/sem/node.cc
@@ -16,8 +16,7 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::Node);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 Node::Node() = default;
 
@@ -25,5 +24,4 @@
 
 Node::~Node() = default;
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/node.h b/src/tint/sem/node.h
index ecf630d..d03b042 100644
--- a/src/tint/sem/node.h
+++ b/src/tint/sem/node.h
@@ -17,8 +17,7 @@
 
 #include "src/tint/castable.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// Node is the base class for all semantic nodes
 class Node : public Castable<Node> {
@@ -33,7 +32,6 @@
   ~Node() override;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_NODE_H_
diff --git a/src/tint/sem/parameter_usage.cc b/src/tint/sem/parameter_usage.cc
index 5721882..3bea237 100644
--- a/src/tint/sem/parameter_usage.cc
+++ b/src/tint/sem/parameter_usage.cc
@@ -24,8 +24,7 @@
 
 #include "src/tint/sem/parameter_usage.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 const char* str(ParameterUsage usage) {
   switch (usage) {
@@ -61,5 +60,4 @@
   return "<unknown>";
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/parameter_usage.cc.tmpl b/src/tint/sem/parameter_usage.cc.tmpl
index 2a9a060..1339171 100644
--- a/src/tint/sem/parameter_usage.cc.tmpl
+++ b/src/tint/sem/parameter_usage.cc.tmpl
@@ -10,8 +10,7 @@
 
 #include "src/tint/sem/parameter_usage.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 const char* str(ParameterUsage usage) {
   switch (usage) {
@@ -25,5 +24,4 @@
   return "<unknown>";
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/parameter_usage.h b/src/tint/sem/parameter_usage.h
index 698d9cb..56f6e78 100644
--- a/src/tint/sem/parameter_usage.h
+++ b/src/tint/sem/parameter_usage.h
@@ -25,8 +25,7 @@
 #ifndef SRC_TINT_SEM_PARAMETER_USAGE_H_
 #define SRC_TINT_SEM_PARAMETER_USAGE_H_
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// ParameterUsage is extra metadata for identifying a parameter based on its
 /// overload position
@@ -50,7 +49,6 @@
 /// @returns a string representation of the given parameter usage.
 const char* str(ParameterUsage usage);
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_PARAMETER_USAGE_H_
diff --git a/src/tint/sem/parameter_usage.h.tmpl b/src/tint/sem/parameter_usage.h.tmpl
index 00a2f99..1edb674 100644
--- a/src/tint/sem/parameter_usage.h.tmpl
+++ b/src/tint/sem/parameter_usage.h.tmpl
@@ -11,8 +11,7 @@
 #ifndef SRC_TINT_SEM_PARAMETER_USAGE_H_
 #define SRC_TINT_SEM_PARAMETER_USAGE_H_
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// ParameterUsage is extra metadata for identifying a parameter based on its
 /// overload position
@@ -26,7 +25,6 @@
 /// @returns a string representation of the given parameter usage.
 const char* str(ParameterUsage usage);
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_PARAMETER_USAGE_H_
diff --git a/src/tint/sem/pipeline_stage_set.h b/src/tint/sem/pipeline_stage_set.h
index 8b96da9..e27f206 100644
--- a/src/tint/sem/pipeline_stage_set.h
+++ b/src/tint/sem/pipeline_stage_set.h
@@ -18,12 +18,10 @@
 #include "src/tint/ast/pipeline_stage.h"
 #include "src/tint/utils/enum_set.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 using PipelineStageSet = utils::EnumSet<ast::PipelineStage>;
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_PIPELINE_STAGE_SET_H_
diff --git a/src/tint/sem/pointer_type.cc b/src/tint/sem/pointer_type.cc
index 43eb514..b1f137a 100644
--- a/src/tint/sem/pointer_type.cc
+++ b/src/tint/sem/pointer_type.cc
@@ -20,8 +20,7 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::Pointer);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 Pointer::Pointer(const Type* subtype,
                  ast::StorageClass storage_class,
@@ -59,5 +58,4 @@
 
 Pointer::~Pointer() = default;
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/pointer_type.h b/src/tint/sem/pointer_type.h
index 7e2e48c..c3697c1 100644
--- a/src/tint/sem/pointer_type.h
+++ b/src/tint/sem/pointer_type.h
@@ -21,8 +21,7 @@
 #include "src/tint/ast/storage_class.h"
 #include "src/tint/sem/type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// A pointer type.
 class Pointer final : public Castable<Pointer, Type> {
@@ -66,7 +65,6 @@
   ast::Access const access_;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_POINTER_TYPE_H_
diff --git a/src/tint/sem/pointer_type_test.cc b/src/tint/sem/pointer_type_test.cc
index cc1dc8a..713677d 100644
--- a/src/tint/sem/pointer_type_test.cc
+++ b/src/tint/sem/pointer_type_test.cc
@@ -15,8 +15,7 @@
 #include "src/tint/sem/test_helper.h"
 #include "src/tint/sem/texture_type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 namespace {
 
 using PointerTest = TestHelper;
@@ -93,5 +92,4 @@
 }
 
 }  // namespace
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/reference_type.cc b/src/tint/sem/reference_type.cc
index 6edf888..6eaceda 100644
--- a/src/tint/sem/reference_type.cc
+++ b/src/tint/sem/reference_type.cc
@@ -19,8 +19,7 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::Reference);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 Reference::Reference(const Type* subtype,
                      ast::StorageClass storage_class,
@@ -58,5 +57,4 @@
 
 Reference::~Reference() = default;
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/reference_type.h b/src/tint/sem/reference_type.h
index cc2921b..d2639a4 100644
--- a/src/tint/sem/reference_type.h
+++ b/src/tint/sem/reference_type.h
@@ -21,8 +21,7 @@
 #include "src/tint/ast/storage_class.h"
 #include "src/tint/sem/type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// A reference type.
 class Reference final : public Castable<Reference, Type> {
@@ -66,7 +65,6 @@
   ast::Access const access_;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_REFERENCE_TYPE_H_
diff --git a/src/tint/sem/reference_type_test.cc b/src/tint/sem/reference_type_test.cc
index 9b3536d..9d99598 100644
--- a/src/tint/sem/reference_type_test.cc
+++ b/src/tint/sem/reference_type_test.cc
@@ -15,8 +15,7 @@
 #include "src/tint/sem/reference_type.h"
 #include "src/tint/sem/test_helper.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 namespace {
 
 using ReferenceTest = TestHelper;
@@ -93,5 +92,4 @@
 }
 
 }  // namespace
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/sampled_texture_type.cc b/src/tint/sem/sampled_texture_type.cc
index 9840a17..5d9d9c5 100644
--- a/src/tint/sem/sampled_texture_type.cc
+++ b/src/tint/sem/sampled_texture_type.cc
@@ -19,8 +19,7 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::SampledTexture);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 SampledTexture::SampledTexture(ast::TextureDimension dim, const Type* type)
     : Base(dim), type_(type) {
@@ -49,5 +48,4 @@
   return out.str();
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/sampled_texture_type.h b/src/tint/sem/sampled_texture_type.h
index 4cfa15c..b67737e 100644
--- a/src/tint/sem/sampled_texture_type.h
+++ b/src/tint/sem/sampled_texture_type.h
@@ -19,8 +19,7 @@
 
 #include "src/tint/sem/texture_type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// A sampled texture type.
 class SampledTexture final : public Castable<SampledTexture, Texture> {
@@ -52,7 +51,6 @@
   const Type* const type_;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_SAMPLED_TEXTURE_TYPE_H_
diff --git a/src/tint/sem/sampled_texture_type_test.cc b/src/tint/sem/sampled_texture_type_test.cc
index 146aaf5..7ddb482 100644
--- a/src/tint/sem/sampled_texture_type_test.cc
+++ b/src/tint/sem/sampled_texture_type_test.cc
@@ -19,8 +19,7 @@
 #include "src/tint/sem/storage_texture_type.h"
 #include "src/tint/sem/test_helper.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 namespace {
 
 using SampledTextureTest = TestHelper;
@@ -91,5 +90,4 @@
 }
 
 }  // namespace
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/sampler_texture_pair.h b/src/tint/sem/sampler_texture_pair.h
index 4773dcf..f9b665f 100644
--- a/src/tint/sem/sampler_texture_pair.h
+++ b/src/tint/sem/sampler_texture_pair.h
@@ -20,8 +20,7 @@
 
 #include "src/tint/sem/binding_point.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// Mapping of a sampler to a texture it samples.
 struct SamplerTexturePair {
@@ -46,8 +45,7 @@
   }
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 namespace std {
 
diff --git a/src/tint/sem/sampler_type.cc b/src/tint/sem/sampler_type.cc
index 6fdbc34..6558a17 100644
--- a/src/tint/sem/sampler_type.cc
+++ b/src/tint/sem/sampler_type.cc
@@ -19,8 +19,7 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::Sampler);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 Sampler::Sampler(ast::SamplerKind kind) : kind_(kind) {}
 
@@ -43,5 +42,4 @@
   return kind_ == ast::SamplerKind::kSampler ? "sampler" : "sampler_comparison";
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/sampler_type.h b/src/tint/sem/sampler_type.h
index fd11fb5..d1fffab 100644
--- a/src/tint/sem/sampler_type.h
+++ b/src/tint/sem/sampler_type.h
@@ -20,8 +20,7 @@
 #include "src/tint/ast/sampler.h"
 #include "src/tint/sem/type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// A sampler type.
 class Sampler final : public Castable<Sampler, Type> {
@@ -57,7 +56,6 @@
   ast::SamplerKind const kind_;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_SAMPLER_TYPE_H_
diff --git a/src/tint/sem/sampler_type_test.cc b/src/tint/sem/sampler_type_test.cc
index b8aa17b..edd57d2 100644
--- a/src/tint/sem/sampler_type_test.cc
+++ b/src/tint/sem/sampler_type_test.cc
@@ -16,8 +16,7 @@
 #include "src/tint/sem/test_helper.h"
 #include "src/tint/sem/texture_type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 namespace {
 
 using SamplerTest = TestHelper;
@@ -67,5 +66,4 @@
 }
 
 }  // namespace
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/sem_array_test.cc b/src/tint/sem/sem_array_test.cc
index 6f84a97..fc78f38 100644
--- a/src/tint/sem/sem_array_test.cc
+++ b/src/tint/sem/sem_array_test.cc
@@ -15,8 +15,7 @@
 #include "src/tint/sem/test_helper.h"
 #include "src/tint/sem/texture_type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 namespace {
 
 using ArrayTest = TestHelper;
@@ -127,5 +126,4 @@
 }
 
 }  // namespace
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/sem_struct_test.cc b/src/tint/sem/sem_struct_test.cc
index 60faf8d..d788be9 100644
--- a/src/tint/sem/sem_struct_test.cc
+++ b/src/tint/sem/sem_struct_test.cc
@@ -16,8 +16,7 @@
 #include "src/tint/sem/test_helper.h"
 #include "src/tint/sem/texture_type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 namespace {
 
 using StructTest = TestHelper;
@@ -120,5 +119,4 @@
 }
 
 }  // namespace
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/statement.cc b/src/tint/sem/statement.cc
index 149507d..2046f63 100644
--- a/src/tint/sem/statement.cc
+++ b/src/tint/sem/statement.cc
@@ -23,8 +23,7 @@
 TINT_INSTANTIATE_TYPEINFO(tint::sem::Statement);
 TINT_INSTANTIATE_TYPEINFO(tint::sem::CompoundStatement);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 Statement::Statement(const ast::Statement* declaration,
                      const CompoundStatement* parent,
@@ -44,5 +43,4 @@
 
 CompoundStatement::~CompoundStatement() = default;
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/statement.h b/src/tint/sem/statement.h
index 708e741..f7cf40c 100644
--- a/src/tint/sem/statement.h
+++ b/src/tint/sem/statement.h
@@ -26,16 +26,12 @@
 }  // namespace ast
 namespace sem {
 class BlockStatement;
+class CompoundStatement;
+class Function;
 }  // namespace sem
 }  // namespace tint
 
-namespace tint {
-namespace sem {
-
-/// Forward declaration
-class CompoundStatement;
-class Function;
-
+namespace tint::sem {
 namespace detail {
 /// FindFirstParentReturn is a traits helper for determining the return type for
 /// the template member function Statement::FindFirstParent().
@@ -182,7 +178,6 @@
   return nullptr;
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_STATEMENT_H_
diff --git a/src/tint/sem/storage_texture_type.cc b/src/tint/sem/storage_texture_type.cc
index 8b98edc..1b017dd 100644
--- a/src/tint/sem/storage_texture_type.cc
+++ b/src/tint/sem/storage_texture_type.cc
@@ -19,8 +19,7 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::StorageTexture);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 StorageTexture::StorageTexture(ast::TextureDimension dim,
                                ast::TexelFormat format,
@@ -87,5 +86,4 @@
   return nullptr;
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/storage_texture_type.h b/src/tint/sem/storage_texture_type.h
index f3d5459..06d8dc5 100644
--- a/src/tint/sem/storage_texture_type.h
+++ b/src/tint/sem/storage_texture_type.h
@@ -21,10 +21,12 @@
 #include "src/tint/ast/storage_texture.h"
 #include "src/tint/sem/texture_type.h"
 
-namespace tint {
-namespace sem {
-
+// Forward Declarations
+namespace tint::sem {
 class Manager;
+}
+
+namespace tint::sem {
 
 /// A storage texture type.
 class StorageTexture final : public Castable<StorageTexture, Texture> {
@@ -75,7 +77,6 @@
   Type* const subtype_;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_STORAGE_TEXTURE_TYPE_H_
diff --git a/src/tint/sem/storage_texture_type_test.cc b/src/tint/sem/storage_texture_type_test.cc
index 7a2dcaa..73361ce 100644
--- a/src/tint/sem/storage_texture_type_test.cc
+++ b/src/tint/sem/storage_texture_type_test.cc
@@ -19,8 +19,7 @@
 #include "src/tint/sem/sampled_texture_type.h"
 #include "src/tint/sem/test_helper.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 namespace {
 
 struct StorageTextureTest : public TestHelper {
@@ -152,5 +151,4 @@
 }
 
 }  // namespace
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/struct.cc b/src/tint/sem/struct.cc
index a2ecc73..ce3029d3 100644
--- a/src/tint/sem/struct.cc
+++ b/src/tint/sem/struct.cc
@@ -26,8 +26,7 @@
 TINT_INSTANTIATE_TYPEINFO(tint::sem::Struct);
 TINT_INSTANTIATE_TYPEINFO(tint::sem::StructMember);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 Struct::Struct(const ast::Struct* declaration,
                Symbol name,
@@ -181,5 +180,4 @@
 
 StructMember::~StructMember() = default;
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/struct.h b/src/tint/sem/struct.h
index dc33dc2..425bbc1 100644
--- a/src/tint/sem/struct.h
+++ b/src/tint/sem/struct.h
@@ -27,18 +27,18 @@
 #include "src/tint/sem/type.h"
 #include "src/tint/symbol.h"
 
-namespace tint {
-
 // Forward declarations
+namespace tint {
 namespace ast {
 class StructMember;
 }  // namespace ast
-
 namespace sem {
-
-// Forward declarations
 class StructMember;
 class Type;
+}  // namespace sem
+}  // namespace tint
+
+namespace tint::sem {
 
 /// A vector of StructMember pointers.
 using StructMemberList = std::vector<const StructMember*>;
@@ -230,7 +230,6 @@
   const uint32_t size_;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_STRUCT_H_
diff --git a/src/tint/sem/switch_statement.cc b/src/tint/sem/switch_statement.cc
index 403ae92..9800ed6 100644
--- a/src/tint/sem/switch_statement.cc
+++ b/src/tint/sem/switch_statement.cc
@@ -19,8 +19,7 @@
 TINT_INSTANTIATE_TYPEINFO(tint::sem::CaseStatement);
 TINT_INSTANTIATE_TYPEINFO(tint::sem::SwitchStatement);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 SwitchStatement::SwitchStatement(const ast::SwitchStatement* declaration,
                                  const CompoundStatement* parent,
@@ -49,5 +48,4 @@
   return static_cast<const ast::CaseStatement*>(Base::Declaration());
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/switch_statement.h b/src/tint/sem/switch_statement.h
index ff17f58..b56bc85 100644
--- a/src/tint/sem/switch_statement.h
+++ b/src/tint/sem/switch_statement.h
@@ -18,15 +18,12 @@
 #include "src/tint/sem/block_statement.h"
 
 // Forward declarations
-namespace tint {
-namespace ast {
+namespace tint::ast {
 class CaseStatement;
 class SwitchStatement;
-}  // namespace ast
-}  // namespace tint
+}  // namespace tint::ast
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// Holds semantic information about an switch statement
 class SwitchStatement final
@@ -74,7 +71,6 @@
   const BlockStatement* body_ = nullptr;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_SWITCH_STATEMENT_H_
diff --git a/src/tint/sem/test_helper.h b/src/tint/sem/test_helper.h
index 1f87769..412e36a 100644
--- a/src/tint/sem/test_helper.h
+++ b/src/tint/sem/test_helper.h
@@ -20,8 +20,7 @@
 #include "gtest/gtest.h"
 #include "src/tint/program_builder.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// Helper class for testing
 template <typename BASE>
@@ -43,7 +42,6 @@
 template <typename T>
 using TestParamHelper = TestHelperBase<testing::TestWithParam<T>>;
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_TEST_HELPER_H_
diff --git a/src/tint/sem/texture_type.cc b/src/tint/sem/texture_type.cc
index 0fa7cb9..e14b606 100644
--- a/src/tint/sem/texture_type.cc
+++ b/src/tint/sem/texture_type.cc
@@ -16,8 +16,7 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::Texture);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 Texture::Texture(ast::TextureDimension dim) : dim_(dim) {}
 
@@ -25,5 +24,4 @@
 
 Texture::~Texture() = default;
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/texture_type.h b/src/tint/sem/texture_type.h
index 23f997b..9aa3330 100644
--- a/src/tint/sem/texture_type.h
+++ b/src/tint/sem/texture_type.h
@@ -18,8 +18,7 @@
 #include "src/tint/ast/texture.h"
 #include "src/tint/sem/type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// A texture type.
 class Texture : public Castable<Texture, Type> {
@@ -38,7 +37,6 @@
   ast::TextureDimension const dim_;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_TEXTURE_TYPE_H_
diff --git a/src/tint/sem/texture_type_test.cc b/src/tint/sem/texture_type_test.cc
index d36e825..8737415 100644
--- a/src/tint/sem/texture_type_test.cc
+++ b/src/tint/sem/texture_type_test.cc
@@ -17,8 +17,7 @@
 #include "src/tint/sem/sampled_texture_type.h"
 #include "src/tint/sem/test_helper.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 namespace {
 
 using TextureTypeDimTest = TestParamHelper<ast::TextureDimension>;
@@ -42,5 +41,4 @@
                                            ast::TextureDimension::kCubeArray));
 
 }  // namespace
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/type.cc b/src/tint/sem/type.cc
index c14ec69..f8c32e7 100644
--- a/src/tint/sem/type.cc
+++ b/src/tint/sem/type.cc
@@ -27,8 +27,7 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::Type);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 Type::Type() = default;
 
@@ -154,5 +153,4 @@
   return IsAnyOf<Sampler, Texture>();
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/type.h b/src/tint/sem/type.h
index c0abce3..c93c4e6 100644
--- a/src/tint/sem/type.h
+++ b/src/tint/sem/type.h
@@ -20,13 +20,13 @@
 
 #include "src/tint/sem/node.h"
 
-namespace tint {
-
 // Forward declarations
+namespace tint {
 class ProgramBuilder;
 class SymbolTable;
+}  // namespace tint
 
-namespace sem {
+namespace tint::sem {
 
 /// Supported memory layouts for calculating sizes
 enum class MemoryLayout { kUniformBuffer, kStorageBuffer };
@@ -118,8 +118,7 @@
   Type();
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 namespace std {
 
diff --git a/src/tint/sem/type_constructor.cc b/src/tint/sem/type_constructor.cc
index 8ad9388..4213edb 100644
--- a/src/tint/sem/type_constructor.cc
+++ b/src/tint/sem/type_constructor.cc
@@ -16,8 +16,7 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::TypeConstructor);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 TypeConstructor::TypeConstructor(const sem::Type* type,
                                  const ParameterList& parameters)
@@ -25,5 +24,4 @@
 
 TypeConstructor::~TypeConstructor() = default;
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/type_constructor.h b/src/tint/sem/type_constructor.h
index ca6bf81..d9ff7a1 100644
--- a/src/tint/sem/type_constructor.h
+++ b/src/tint/sem/type_constructor.h
@@ -17,8 +17,7 @@
 
 #include "src/tint/sem/call_target.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// TypeConstructor is the CallTarget for a type constructor.
 class TypeConstructor final : public Castable<TypeConstructor, CallTarget> {
@@ -32,7 +31,6 @@
   ~TypeConstructor() override;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_TYPE_CONSTRUCTOR_H_
diff --git a/src/tint/sem/type_conversion.cc b/src/tint/sem/type_conversion.cc
index 7def17b..47a4a71 100644
--- a/src/tint/sem/type_conversion.cc
+++ b/src/tint/sem/type_conversion.cc
@@ -16,8 +16,7 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::TypeConversion);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 TypeConversion::TypeConversion(const sem::Type* type,
                                const sem::Parameter* parameter)
@@ -25,5 +24,4 @@
 
 TypeConversion::~TypeConversion() = default;
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/type_conversion.h b/src/tint/sem/type_conversion.h
index fcea914..5433641 100644
--- a/src/tint/sem/type_conversion.h
+++ b/src/tint/sem/type_conversion.h
@@ -17,8 +17,7 @@
 
 #include "src/tint/sem/call_target.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// TypeConversion is the CallTarget for a type conversion (cast).
 class TypeConversion final : public Castable<TypeConversion, CallTarget> {
@@ -38,7 +37,6 @@
   const sem::Type* Target() const { return ReturnType(); }
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_TYPE_CONVERSION_H_
diff --git a/src/tint/sem/type_manager.cc b/src/tint/sem/type_manager.cc
index e9161d1..e6f5f6d 100644
--- a/src/tint/sem/type_manager.cc
+++ b/src/tint/sem/type_manager.cc
@@ -14,13 +14,11 @@
 
 #include "src/tint/sem/type_manager.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 Manager::Manager() = default;
 Manager::Manager(Manager&&) = default;
 Manager& Manager::operator=(Manager&& rhs) = default;
 Manager::~Manager() = default;
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/type_manager_test.cc b/src/tint/sem/type_manager_test.cc
index 7fc96d9..6cbea9b 100644
--- a/src/tint/sem/type_manager_test.cc
+++ b/src/tint/sem/type_manager_test.cc
@@ -18,8 +18,7 @@
 #include "src/tint/sem/i32_type.h"
 #include "src/tint/sem/u32_type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 namespace {
 
 template <typename T>
@@ -79,5 +78,4 @@
 }
 
 }  // namespace
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/type_mappings.h b/src/tint/sem/type_mappings.h
index 1ca2b6d..123b8cc 100644
--- a/src/tint/sem/type_mappings.h
+++ b/src/tint/sem/type_mappings.h
@@ -17,9 +17,8 @@
 
 #include <type_traits>
 
-namespace tint {
-
 // Forward declarations
+namespace tint {
 namespace ast {
 class Array;
 class CallExpression;
@@ -37,9 +36,7 @@
 class TypeDecl;
 class Variable;
 }  // namespace ast
-
 namespace sem {
-// Forward declarations
 class Array;
 class Call;
 class Expression;
@@ -54,6 +51,10 @@
 class StructMember;
 class Type;
 class Variable;
+}  // namespace sem
+}  // namespace tint
+
+namespace tint::sem {
 
 /// TypeMappings is a struct that holds undefined `operator()` methods that's
 /// used by SemanticNodeTypeFor to map AST / type node types to their
@@ -85,7 +86,6 @@
 using SemanticNodeTypeFor = typename std::remove_pointer<decltype(
     TypeMappings()(std::declval<AST_OR_TYPE*>()))>::type;
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_TYPE_MAPPINGS_H_
diff --git a/src/tint/sem/u32_type.cc b/src/tint/sem/u32_type.cc
index 1580148..f73b617 100644
--- a/src/tint/sem/u32_type.cc
+++ b/src/tint/sem/u32_type.cc
@@ -18,8 +18,7 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::U32);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 U32::U32() = default;
 
@@ -51,5 +50,4 @@
   return 4;
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/u32_type.h b/src/tint/sem/u32_type.h
index 5fa5c12..d81886c 100644
--- a/src/tint/sem/u32_type.h
+++ b/src/tint/sem/u32_type.h
@@ -19,8 +19,7 @@
 
 #include "src/tint/sem/type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// A unsigned int 32 type.
 class U32 final : public Castable<U32, Type> {
@@ -54,7 +53,6 @@
   uint32_t Align() const override;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_U32_TYPE_H_
diff --git a/src/tint/sem/u32_type_test.cc b/src/tint/sem/u32_type_test.cc
index 1bbdc9b..dae4c42 100644
--- a/src/tint/sem/u32_type_test.cc
+++ b/src/tint/sem/u32_type_test.cc
@@ -15,8 +15,7 @@
 #include "src/tint/sem/test_helper.h"
 #include "src/tint/sem/texture_type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 namespace {
 
 using U32Test = TestHelper;
@@ -46,5 +45,4 @@
 }
 
 }  // namespace
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/variable.cc b/src/tint/sem/variable.cc
index b8e4a49..af3deb9 100644
--- a/src/tint/sem/variable.cc
+++ b/src/tint/sem/variable.cc
@@ -25,8 +25,7 @@
 TINT_INSTANTIATE_TYPEINFO(tint::sem::Parameter);
 TINT_INSTANTIATE_TYPEINFO(tint::sem::VariableUser);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 Variable::Variable(const ast::Variable* declaration,
                    const sem::Type* type,
@@ -85,5 +84,4 @@
            /* has_side_effects */ false),
       variable_(variable) {}
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/variable.h b/src/tint/sem/variable.h
index 0f196d0..4c89f50 100644
--- a/src/tint/sem/variable.h
+++ b/src/tint/sem/variable.h
@@ -24,20 +24,20 @@
 #include "src/tint/sem/expression.h"
 #include "src/tint/sem/parameter_usage.h"
 
-namespace tint {
-
 // Forward declarations
+namespace tint {
 namespace ast {
 class IdentifierExpression;
 class Variable;
 }  // namespace ast
-
 namespace sem {
-
-// Forward declarations
 class CallTarget;
 class Type;
 class VariableUser;
+}  // namespace sem
+}  // namespace tint
+
+namespace tint::sem {
 
 /// Variable is the base class for local variables, global variables and
 /// parameters.
@@ -252,8 +252,7 @@
 /// A pair of sem::Variables. Can be hashed.
 typedef std::pair<const Variable*, const Variable*> VariablePair;
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 namespace std {
 
diff --git a/src/tint/sem/vector_type.cc b/src/tint/sem/vector_type.cc
index 518bacf..1df3945 100644
--- a/src/tint/sem/vector_type.cc
+++ b/src/tint/sem/vector_type.cc
@@ -19,8 +19,7 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::Vector);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 Vector::Vector(Type const* subtype, uint32_t width)
     : subtype_(subtype), width_(width) {
@@ -85,5 +84,4 @@
   return 0;  // Unreachable
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/vector_type.h b/src/tint/sem/vector_type.h
index 48ee1c5..4542c5b 100644
--- a/src/tint/sem/vector_type.h
+++ b/src/tint/sem/vector_type.h
@@ -19,8 +19,7 @@
 
 #include "src/tint/sem/type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// A vector type.
 class Vector final : public Castable<Vector, Type> {
@@ -75,7 +74,6 @@
   const uint32_t width_;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_VECTOR_TYPE_H_
diff --git a/src/tint/sem/vector_type_test.cc b/src/tint/sem/vector_type_test.cc
index 1640d13..4d53918 100644
--- a/src/tint/sem/vector_type_test.cc
+++ b/src/tint/sem/vector_type_test.cc
@@ -15,8 +15,7 @@
 #include "src/tint/sem/test_helper.h"
 #include "src/tint/sem/texture_type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 namespace {
 
 using VectorTest = TestHelper;
@@ -65,5 +64,4 @@
 }
 
 }  // namespace
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/void_type.cc b/src/tint/sem/void_type.cc
index e366e81..6dae921 100644
--- a/src/tint/sem/void_type.cc
+++ b/src/tint/sem/void_type.cc
@@ -18,8 +18,7 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::Void);
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 Void::Void() = default;
 
@@ -39,5 +38,4 @@
   return "void";
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
diff --git a/src/tint/sem/void_type.h b/src/tint/sem/void_type.h
index 0411de0..1131cb8 100644
--- a/src/tint/sem/void_type.h
+++ b/src/tint/sem/void_type.h
@@ -19,8 +19,7 @@
 
 #include "src/tint/sem/type.h"
 
-namespace tint {
-namespace sem {
+namespace tint::sem {
 
 /// A void type
 class Void final : public Castable<Void, Type> {
@@ -44,7 +43,6 @@
   std::string FriendlyName(const SymbolTable& symbols) const override;
 };
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::sem
 
 #endif  // SRC_TINT_SEM_VOID_TYPE_H_