diff --git a/source/validate.cpp b/source/validate.cpp
index 0c62937..4676aca 100644
--- a/source/validate.cpp
+++ b/source/validate.cpp
@@ -68,9 +68,10 @@
     const spv_ext_inst_table extInstTable, const ValidationState_t& state,
     spv_position position, spv_diagnostic* pDiagnostic) {
   position->index = SPV_INDEX_INSTRUCTION;
-  spvCheckReturn(spvValidateInstructionIDs(pInsts, count, opcodeTable,
-                                           operandTable, extInstTable, state,
-                                           position, pDiagnostic));
+  if (auto error =
+          spvValidateInstructionIDs(pInsts, count, opcodeTable, operandTable,
+                                    extInstTable, state, position, pDiagnostic))
+    return error;
   return SPV_SUCCESS;
 }
 
@@ -132,10 +133,10 @@
 
   DebugInstructionPass(_, inst);
   // TODO(umar): Perform data rules pass
-  spvCheckReturn(IdPass(_, inst));
-  spvCheckReturn(ModuleLayoutPass(_, inst));
-  spvCheckReturn(CfgPass(_, inst));
-  spvCheckReturn(InstructionPass(_, inst));
+  if (auto error = IdPass(_, inst)) return error;
+  if (auto error = ModuleLayoutPass(_, inst)) return error;
+  if (auto error = CfgPass(_, inst)) return error;
+  if (auto error = InstructionPass(_, inst)) return error;
 
   return SPV_SUCCESS;
 }
@@ -166,7 +167,9 @@
 #ifdef __clang__
 #define UNUSED(func) [[gnu::unused]] func
 #elif defined(__GNUC__)
-#define UNUSED(func) func __attribute__((unused)); func
+#define UNUSED(func)            \
+  func __attribute__((unused)); \
+  func
 #elif defined(_MSC_VER)
 #define UNUSED(func) func
 #endif
@@ -204,9 +207,10 @@
   // NOTE: Parse the module and perform inline validation checks. These
   // checks do not require the the knowledge of the whole module.
   ValidationState_t vstate(pDiagnostic, context);
-  spvCheckReturn(spvBinaryParse(context, &vstate, binary->code,
-                                binary->wordCount, setHeader,
-                                ProcessInstruction, pDiagnostic));
+  if (auto error =
+          spvBinaryParse(context, &vstate, binary->code, binary->wordCount,
+                         setHeader, ProcessInstruction, pDiagnostic))
+    return error;
 
   if (vstate.in_function_body())
     return vstate.diag(SPV_ERROR_INVALID_LAYOUT)
@@ -230,9 +234,9 @@
 
   // CFG checks are performed after the binary has been parsed
   // and the CFGPass has collected information about the control flow
-  spvCheckReturn(PerformCfgChecks(vstate));
-  spvCheckReturn(UpdateIdUse(vstate));
-  spvCheckReturn(CheckIdDefinitionDominateUse(vstate));
+  if (auto error = PerformCfgChecks(vstate)) return error;
+  if (auto error = UpdateIdUse(vstate)) return error;
+  if (auto error = CheckIdDefinitionDominateUse(vstate)) return error;
 
   // NOTE: Copy each instruction for easier processing
   std::vector<spv_instruction_t> instructions;
@@ -250,10 +254,8 @@
   }
 
   position.index = SPV_INDEX_INSTRUCTION;
-  spvCheckReturn(spvValidateIDs(instructions.data(), instructions.size(),
-                                context->opcode_table, context->operand_table,
-                                context->ext_inst_table, vstate, &position,
-                                pDiagnostic));
-
-  return SPV_SUCCESS;
+  return spvValidateIDs(instructions.data(), instructions.size(),
+                        context->opcode_table, context->operand_table,
+                        context->ext_inst_table, vstate, &position,
+                        pDiagnostic);
 }
diff --git a/source/validate.h b/source/validate.h
index b8ba662..3123c40 100644
--- a/source/validate.h
+++ b/source/validate.h
@@ -196,7 +196,4 @@
                             const spv_ext_inst_table extInstTable,
                             spv_position position, spv_diagnostic* pDiagnostic);
 
-#define spvCheckReturn(expression) \
-  if (spv_result_t error = (expression)) return error;
-
 #endif  // LIBSPIRV_VALIDATE_H_
diff --git a/source/validate_cfg.cpp b/source/validate_cfg.cpp
index 66a9b94..988256a 100644
--- a/source/validate_cfg.cpp
+++ b/source/validate_cfg.cpp
@@ -416,11 +416,10 @@
     auto ignore_edge = [](cbb_ptr, cbb_ptr) {};
     if (!function.ordered_blocks().empty()) {
       /// calculate dominators
-      DepthFirstTraversal(function.first_block(),
-                          function.AugmentedCFGSuccessorsFunction(),
-                          ignore_block,
-                          [&](cbb_ptr b) { postorder.push_back(b); },
-                          ignore_edge);
+      DepthFirstTraversal(
+          function.first_block(), function.AugmentedCFGSuccessorsFunction(),
+          ignore_block, [&](cbb_ptr b) { postorder.push_back(b); },
+          ignore_edge);
       auto edges = libspirv::CalculateDominators(
           postorder, function.AugmentedCFGPredecessorsFunction());
       for (auto edge : edges) {
@@ -428,11 +427,10 @@
       }
 
       /// calculate post dominators
-      DepthFirstTraversal(function.pseudo_exit_block(),
-                          function.AugmentedCFGPredecessorsFunction(),
-                          ignore_block,
-                          [&](cbb_ptr b) { postdom_postorder.push_back(b); },
-                          ignore_edge);
+      DepthFirstTraversal(
+          function.pseudo_exit_block(),
+          function.AugmentedCFGPredecessorsFunction(), ignore_block,
+          [&](cbb_ptr b) { postdom_postorder.push_back(b); }, ignore_edge);
       auto postdom_edges = libspirv::CalculateDominators(
           postdom_postorder, function.AugmentedCFGSuccessorsFunction());
       for (auto edge : postdom_edges) {
@@ -468,7 +466,8 @@
 
     /// Structured control flow checks are only required for shader capabilities
     if (_.HasCapability(SpvCapabilityShader)) {
-      spvCheckReturn(StructuredControlFlowChecks(_, function, back_edges));
+      if (auto error = StructuredControlFlowChecks(_, function, back_edges))
+        return error;
     }
   }
   return SPV_SUCCESS;
@@ -479,21 +478,24 @@
   SpvOp opcode = static_cast<SpvOp>(inst->opcode);
   switch (opcode) {
     case SpvOpLabel:
-      spvCheckReturn(_.current_function().RegisterBlock(inst->result_id));
+      if (auto error = _.current_function().RegisterBlock(inst->result_id))
+        return error;
       break;
     case SpvOpLoopMerge: {
       uint32_t merge_block = inst->words[inst->operands[0].offset];
       uint32_t continue_block = inst->words[inst->operands[1].offset];
       CFG_ASSERT(MergeBlockAssert, merge_block);
 
-      spvCheckReturn(
-          _.current_function().RegisterLoopMerge(merge_block, continue_block));
+      if (auto error = _.current_function().RegisterLoopMerge(merge_block,
+                                                              continue_block))
+        return error;
     } break;
     case SpvOpSelectionMerge: {
       uint32_t merge_block = inst->words[inst->operands[0].offset];
       CFG_ASSERT(MergeBlockAssert, merge_block);
 
-      spvCheckReturn(_.current_function().RegisterSelectionMerge(merge_block));
+      if (auto error = _.current_function().RegisterSelectionMerge(merge_block))
+        return error;
     } break;
     case SpvOpBranch: {
       uint32_t target = inst->words[inst->operands[0].offset];
diff --git a/source/validate_layout.cpp b/source/validate_layout.cpp
index 33519c1..af1af49 100644
--- a/source/validate_layout.cpp
+++ b/source/validate_layout.cpp
@@ -89,12 +89,15 @@
         }
         auto control_mask = static_cast<SpvFunctionControlMask>(
             inst->words[inst->operands[2].offset]);
-        spvCheckReturn(
-            _.RegisterFunction(inst->result_id, inst->type_id, control_mask,
-                               inst->words[inst->operands[3].offset]));
-        if (_.current_layout_section() == kLayoutFunctionDefinitions)
-          spvCheckReturn(_.current_function().RegisterSetFunctionDeclType(
-              FunctionDecl::kFunctionDeclDefinition));
+        if (auto error =
+                _.RegisterFunction(inst->result_id, inst->type_id, control_mask,
+                                   inst->words[inst->operands[3].offset]))
+          return error;
+        if (_.current_layout_section() == kLayoutFunctionDefinitions) {
+          if (auto error = _.current_function().RegisterSetFunctionDeclType(
+                  FunctionDecl::kFunctionDeclDefinition))
+            return error;
+        }
       } break;
 
       case SpvOpFunctionParameter:
@@ -108,8 +111,9 @@
                  << "Function parameters must only appear immediately after "
                     "the function definition";
         }
-        spvCheckReturn(_.current_function().RegisterFunctionParameter(
-            inst->result_id, inst->type_id));
+        if (auto error = _.current_function().RegisterFunctionParameter(
+                inst->result_id, inst->type_id))
+          return error;
         break;
 
       case SpvOpFunctionEnd:
@@ -128,10 +132,11 @@
                                                      "function definitions.";
         }
         if (_.current_layout_section() == kLayoutFunctionDeclarations) {
-          spvCheckReturn(_.current_function().RegisterSetFunctionDeclType(
-              FunctionDecl::kFunctionDeclDeclaration));
+          if (auto error = _.current_function().RegisterSetFunctionDeclType(
+                  FunctionDecl::kFunctionDeclDeclaration))
+            return error;
         }
-        spvCheckReturn(_.RegisterFunctionEnd());
+        if (auto error = _.RegisterFunctionEnd()) return error;
         break;
 
       case SpvOpLine:
@@ -151,8 +156,9 @@
         }
         if (_.current_layout_section() == kLayoutFunctionDeclarations) {
           _.ProgressToNextLayoutSectionOrder();
-          spvCheckReturn(_.current_function().RegisterSetFunctionDeclType(
-              FunctionDecl::kFunctionDeclDefinition));
+          if (auto error = _.current_function().RegisterSetFunctionDeclType(
+                  FunctionDecl::kFunctionDeclDefinition))
+            return error;
         }
         break;
 
@@ -198,13 +204,15 @@
     case kLayoutDebug2:
     case kLayoutAnnotations:
     case kLayoutTypes:
-      spvCheckReturn(ModuleScopedInstructions(_, inst, opcode));
+      if (auto error = ModuleScopedInstructions(_, inst, opcode)) return error;
       break;
     case kLayoutFunctionDeclarations:
     case kLayoutFunctionDefinitions:
-      spvCheckReturn(FunctionScopedInstructions(_, inst, opcode));
+      if (auto error = FunctionScopedInstructions(_, inst, opcode)) {
+        return error;
+      }
       break;
-  }  // switch(getLayoutSection())
+  }
   return SPV_SUCCESS;
 }
 }  /// namespace libspirv
