tint/dependency_graph: Handle diagnostic controls Bug: 1809 Change-Id: I376d0758a09463b37e2d71040cc8add5897ef8bb Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/117564 Commit-Queue: James Price <jrprice@google.com> Reviewed-by: Ben Clayton <bclayton@google.com> Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/src/tint/resolver/dependency_graph.cc b/src/tint/resolver/dependency_graph.cc index 17fcb47..5ece264 100644 --- a/src/tint/resolver/dependency_graph.cc +++ b/src/tint/resolver/dependency_graph.cc
@@ -31,6 +31,7 @@ #include "src/tint/ast/continue_statement.h" #include "src/tint/ast/depth_multisampled_texture.h" #include "src/tint/ast/depth_texture.h" +#include "src/tint/ast/diagnostic_attribute.h" #include "src/tint/ast/discard_statement.h" #include "src/tint/ast/external_texture.h" #include "src/tint/ast/f16.h" @@ -204,8 +205,11 @@ TraverseExpression(var->initializer); } }, + [&](const ast::DiagnosticControl*) { + // Diagnostic control directives do not affect the dependency graph. + }, [&](const ast::Enable*) { - // Enable directives do not effect the dependency graph. + // Enable directives do not affect the dependency graph. }, [&](const ast::ConstAssert* assertion) { TraverseExpression(assertion->condition); }, [&](Default) { UnhandledNode(diagnostics_, global->node); }); @@ -454,9 +458,9 @@ return; } - if (attr->IsAnyOf<ast::BuiltinAttribute, ast::InternalAttribute, ast::InterpolateAttribute, - ast::InvariantAttribute, ast::StageAttribute, ast::StrideAttribute, - ast::StructMemberOffsetAttribute>()) { + if (attr->IsAnyOf<ast::BuiltinAttribute, ast::DiagnosticAttribute, ast::InternalAttribute, + ast::InterpolateAttribute, ast::InvariantAttribute, ast::StageAttribute, + ast::StrideAttribute, ast::StructMemberOffsetAttribute>()) { return; } @@ -555,6 +559,7 @@ [&](const ast::TypeDecl* td) { return td->name; }, [&](const ast::Function* func) { return func->symbol; }, [&](const ast::Variable* var) { return var->symbol; }, + [&](const ast::DiagnosticControl*) { return Symbol(); }, [&](const ast::Enable*) { return Symbol(); }, [&](const ast::ConstAssert*) { return Symbol(); }, [&](Default) { @@ -663,16 +668,16 @@ return; // This code assumes there are no undeclared identifiers. } - // Make sure all 'enable' directives go before any other global declarations. + // Make sure all directives go before any other global declarations. for (auto* global : declaration_order_) { - if (auto* enable = global->node->As<ast::Enable>()) { - sorted_.Add(enable); + if (global->node->IsAnyOf<ast::DiagnosticControl, ast::Enable>()) { + sorted_.Add(global->node); } } for (auto* global : declaration_order_) { - if (global->node->Is<ast::Enable>()) { - // Skip 'enable' directives here, as they are already added. + if (global->node->IsAnyOf<ast::DiagnosticControl, ast::Enable>()) { + // Skip directives here, as they are already added. continue; } utils::UniqueVector<const Global*, 8> stack;