LCOV - code coverage report
Current view: top level - gcc/rust/resolve - rust-default-resolver.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 99.6 % 282 281
Test Date: 2026-09-12 16:25:28 Functions: 100.0 % 60 60
Legend: Lines:     hit not hit

            Line data    Source code
       1              : // Copyright (C) 2020-2026 Free Software Foundation, Inc.
       2              : 
       3              : // This file is part of GCC.
       4              : 
       5              : // GCC is free software; you can redistribute it and/or modify it under
       6              : // the terms of the GNU General Public License as published by the Free
       7              : // Software Foundation; either version 3, or (at your option) any later
       8              : // version.
       9              : 
      10              : // GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      11              : // WARRANTY; without even the implied warranty of MERCHANTABILITY or
      12              : // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      13              : // for more details.
      14              : 
      15              : // You should have received a copy of the GNU General Public License
      16              : // along with GCC; see the file COPYING3.  If not see
      17              : // <http://www.gnu.org/licenses/>.
      18              : 
      19              : #include "rust-default-resolver.h"
      20              : #include "optional.h"
      21              : #include "rust-ast-full.h"
      22              : #include "rust-ast-visitor.h"
      23              : #include "rust-ast.h"
      24              : #include "rust-attribute-values.h"
      25              : #include "rust-item.h"
      26              : #include "rust-path.h"
      27              : 
      28              : namespace Rust {
      29              : namespace Resolver2_0 {
      30              : 
      31              : void
      32        32437 : DefaultResolver::visit (AST::Crate &crate)
      33              : {
      34              :   // Guard against infinite recursion: `extern crate self;` resolves to the
      35              :   // current crate, causing visit(AST::Crate) to call itself infinitely.
      36        32437 :   if (!visited_crates.insert (crate.get_node_id ()).second)
      37            0 :     return;
      38              : 
      39        64874 :   auto inner_fn = [this, &crate] () {
      40        32437 :     maybe_prelude_import ();
      41        32437 :     AST::DefaultASTVisitor::visit (crate);
      42        64872 :   };
      43              : 
      44        32437 :   auto &mappings = Analysis::Mappings::get ();
      45              : 
      46        32437 :   auto crate_num = mappings.lookup_crate_num (crate.get_node_id ());
      47        32437 :   rust_assert (crate_num.has_value ());
      48        32437 :   auto crate_name = mappings.get_crate_name (*crate_num);
      49        32437 :   rust_assert (crate_name.has_value ());
      50              : 
      51        64874 :   ctx.canonical_ctx.scope_crate (crate.get_node_id (), *crate_name, inner_fn);
      52              : }
      53              : 
      54              : void
      55      1305678 : DefaultResolver::visit (AST::BlockExpr &expr)
      56              : {
      57              :   // extracting the lambda from the `scoped` call otherwise the code looks like
      58              :   // a hot turd thanks to our .clang-format
      59              : 
      60      1305678 :   auto inner_fn = [this, &expr] () { AST::DefaultASTVisitor::visit (expr); };
      61              : 
      62      1305678 :   ctx.scoped (Rib::Kind::Normal, expr.get_node_id (), inner_fn);
      63      1305673 : }
      64              : 
      65              : void
      66        26012 : DefaultResolver::visit (AST::Module &module)
      67              : {
      68        52024 :   auto item_fn_1 = [this, &module] () {
      69        26012 :     maybe_prelude_import ();
      70        26012 :     AST::DefaultASTVisitor::visit (module);
      71        52024 :   };
      72              : 
      73        52024 :   auto item_fn_2 = [this, &module, &item_fn_1] () {
      74        26012 :     ctx.canonical_ctx.scope (module.get_node_id (), module.get_name (),
      75              :                              std::move (item_fn_1));
      76        52024 :   };
      77              : 
      78        52024 :   ctx.scoped (Rib::Kind::Module, module.get_node_id (), item_fn_2,
      79        52024 :               module.get_name ());
      80        26012 : }
      81              : 
      82              : void
      83       981286 : DefaultResolver::visit (AST::Function &function)
      84              : {
      85       981286 :   auto def_fn_1
      86       981286 :     = [this, &function] () { AST::DefaultASTVisitor::visit (function); };
      87              : 
      88      1962572 :   auto def_fn_2 = [this, &function, &def_fn_1] () {
      89       981286 :     ctx.canonical_ctx.scope (function.get_node_id (),
      90       981286 :                              function.get_function_name (),
      91              :                              std::move (def_fn_1));
      92      1962570 :   };
      93              : 
      94      1962572 :   ctx.scoped (Rib::Kind::Function, function.get_node_id (), def_fn_2,
      95      1962570 :               function.get_function_name ());
      96       981284 : }
      97              : 
      98              : void
      99         3783 : DefaultResolver::visit (AST::LoopExpr &expr)
     100              : {
     101         3783 :   ctx.scoped (Rib::Kind::Normal, expr.get_node_id (),
     102        11348 :               [this, &expr] () { AST::DefaultASTVisitor::visit (expr); });
     103         3782 : }
     104              : 
     105              : void
     106         7772 : DefaultResolver::visit (AST::WhileLoopExpr &expr)
     107              : {
     108         7772 :   ctx.scoped (Rib::Kind::Normal, expr.get_node_id (),
     109        23316 :               [this, &expr] () { AST::DefaultASTVisitor::visit (expr); });
     110         7772 : }
     111              : 
     112              : void
     113         1594 : DefaultResolver::visit (AST::WhileLetLoopExpr &expr)
     114              : {
     115         1594 :   ctx.scoped (Rib::Kind::Normal, expr.get_node_id (),
     116         4782 :               [this, &expr] () { AST::DefaultASTVisitor::visit (expr); });
     117         1594 : }
     118              : void
     119         7208 : DefaultResolver::visit (AST::ForLoopExpr &expr)
     120              : {
     121         7208 :   ctx.scoped (Rib::Kind::Normal, expr.get_node_id (),
     122        21624 :               [this, &expr] () { AST::DefaultASTVisitor::visit (expr); });
     123         7208 : }
     124              : 
     125              : void
     126         6728 : DefaultResolver::visit_if_let_patterns (AST::IfLetExpr &expr)
     127              : {
     128         6728 :   visit (expr.get_pattern ());
     129         6728 : }
     130              : 
     131              : void
     132         6728 : DefaultResolver::visit (AST::IfLetExpr &expr)
     133              : {
     134        13456 :   auto inner_vis = [this, &expr] () {
     135         6728 :     visit_if_let_patterns (expr);
     136         6728 :     visit (expr.get_if_block ());
     137        13456 :   };
     138              : 
     139         6728 :   visit_outer_attrs (expr);
     140              : 
     141         6728 :   visit (expr.get_value_expr ());
     142              : 
     143         6728 :   ctx.scoped (Rib::Kind::Normal, expr.get_node_id (), inner_vis);
     144         6728 : }
     145              : 
     146              : void
     147         2232 : DefaultResolver::visit (AST::IfLetExprConseqElse &expr)
     148              : {
     149         2232 :   DefaultResolver::visit (static_cast<AST::IfLetExpr &> (expr));
     150         2232 :   visit (expr.get_else_block ());
     151         2232 : }
     152              : 
     153              : void
     154        36335 : DefaultResolver::visit (AST::Trait &trait)
     155              : {
     156        36335 :   visit_outer_attrs (trait);
     157        36335 :   visit (trait.get_visibility ());
     158        36335 :   visit_inner_attrs (trait);
     159              : 
     160        72670 :   auto inner_fn_1 = [this, &trait] () {
     161        87193 :     for (auto &item : trait.get_trait_items ())
     162        50858 :       visit (item);
     163        72670 :   };
     164              : 
     165        72670 :   auto inner_fn_2 = [this, &trait, &inner_fn_1] () {
     166        36335 :     visit (trait.get_implicit_self ());
     167        45241 :     for (auto &generic : trait.get_generic_params ())
     168         8906 :       visit (generic);
     169        36335 :     if (trait.has_where_clause ())
     170           56 :       visit (trait.get_where_clause ());
     171        46049 :     for (auto &bound : trait.get_type_param_bounds ())
     172         9714 :       visit (bound);
     173              : 
     174        36335 :     ctx.scoped (Rib::Kind::TraitOrImpl, trait.get_node_id (), inner_fn_1);
     175        72670 :   };
     176              : 
     177        72670 :   auto inner_fn_3 = [this, &trait, &inner_fn_2] () {
     178        36335 :     ctx.canonical_ctx.scope (trait.get_node_id (), trait.get_identifier (),
     179              :                              std::move (inner_fn_2));
     180        72670 :   };
     181              : 
     182        72670 :   ctx.scoped (Rib::Kind::Generics, trait.get_node_id (), inner_fn_3,
     183        72670 :               trait.get_identifier () /* FIXME: Is that valid?*/);
     184        36335 : }
     185              : 
     186              : static bool
     187        27334 : is_lang_impl (std::vector<AST::Attribute> &outer_attrs)
     188              : {
     189        30999 :   for (auto &attr : outer_attrs)
     190         6761 :     if (attr.get_path ().as_string () == Values::Attributes::LANG)
     191        27334 :       return true;
     192              : 
     193              :   return false;
     194              : }
     195              : 
     196              : void
     197        27334 : DefaultResolver::visit (AST::InherentImpl &impl)
     198              : {
     199        27334 :   visit_outer_attrs (impl);
     200        27334 :   visit (impl.get_visibility ());
     201        27334 :   visit_inner_attrs (impl);
     202              : 
     203        54668 :   auto inner_fn_1 = [this, &impl] () {
     204       201420 :     for (auto &item : impl.get_impl_items ())
     205       174086 :       visit (item);
     206        54668 :   };
     207              : 
     208        54668 :   auto inner_fn_2 = [this, &impl, &inner_fn_1] () {
     209        27334 :     maybe_insert_big_self (impl);
     210        48525 :     for (auto &generic : impl.get_generic_params ())
     211        21191 :       visit (generic);
     212        27334 :     if (impl.has_where_clause ())
     213          221 :       visit (impl.get_where_clause ());
     214        27334 :     visit_impl_type (impl.get_type ());
     215              : 
     216        27334 :     ctx.scoped (Rib::Kind::TraitOrImpl, impl.get_node_id (), inner_fn_1);
     217        54668 :   };
     218              : 
     219        54668 :   auto inner_fn_3 = [this, &impl, &inner_fn_2] () {
     220        27334 :     ctx.canonical_ctx.scope_impl (impl, std::move (inner_fn_2));
     221        54668 :   };
     222              : 
     223        27334 :   ctx.scoped (Rib::Kind::Generics, impl.get_node_id (), inner_fn_3);
     224              : 
     225        27334 :   if (is_lang_impl (impl.get_outer_attrs ()))
     226              :     {
     227         3096 :       if (impl.get_type ().get_type_kind () == AST::Type::Kind::TypePath)
     228              :         {
     229         1482 :           auto type = static_cast<AST::TypePath &> (impl.get_type ());
     230         1482 :           auto type_name = type.as_string ();
     231              : 
     232         4446 :           ctx.types.insert_lang_prelude (type_name, impl.get_node_id ());
     233         1482 :         }
     234              :     }
     235        27334 : }
     236              : 
     237              : void
     238       490527 : DefaultResolver::visit (AST::TraitImpl &impl)
     239              : {
     240       490527 :   visit_outer_attrs (impl);
     241       490527 :   visit (impl.get_visibility ());
     242       490527 :   visit_inner_attrs (impl);
     243              : 
     244       981054 :   auto inner_fn_1 = [this, &impl] () {
     245      1184946 :     for (auto &item : impl.get_impl_items ())
     246       694419 :       visit (item);
     247       981054 :   };
     248              : 
     249       981054 :   auto inner_fn_2 = [this, &impl, &inner_fn_1] () {
     250       490527 :     maybe_insert_big_self (impl);
     251       951003 :     for (auto &generic : impl.get_generic_params ())
     252       460476 :       visit (generic);
     253       490527 :     if (impl.has_where_clause ())
     254        25732 :       visit (impl.get_where_clause ());
     255       490527 :     visit_impl_type (impl.get_type ());
     256       490527 :     visit (impl.get_trait_path ());
     257              : 
     258       490527 :     ctx.scoped (Rib::Kind::TraitOrImpl, impl.get_node_id (), inner_fn_1);
     259       981054 :   };
     260              : 
     261       981054 :   auto inner_fn_3 = [this, &impl, &inner_fn_2] () {
     262       490527 :     ctx.canonical_ctx.scope_impl (impl, std::move (inner_fn_2));
     263       981054 :   };
     264              : 
     265       490527 :   ctx.scoped (Rib::Kind::Generics, impl.get_node_id (), inner_fn_3);
     266       490527 : }
     267              : 
     268              : void
     269        52307 : DefaultResolver::visit (AST::StructStruct &type)
     270              : {
     271        52307 :   auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
     272              : 
     273       104614 :   auto inner_fn_2 = [this, &type, &inner_fn_1] () {
     274        52307 :     ctx.canonical_ctx.scope (type.get_node_id (), type.get_struct_name (),
     275              :                              std::move (inner_fn_1));
     276       104614 :   };
     277              : 
     278        52307 :   ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
     279       156921 :               inner_fn_2, type.get_struct_name ());
     280        52307 : }
     281              : 
     282              : void
     283        13459 : DefaultResolver::visit (AST::TupleStruct &type)
     284              : {
     285        13459 :   auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
     286              : 
     287        26918 :   auto inner_fn_2 = [this, &type, &inner_fn_1] () {
     288        13459 :     ctx.canonical_ctx.scope (type.get_node_id (), type.get_struct_name (),
     289              :                              std::move (inner_fn_1));
     290        26918 :   };
     291              : 
     292        13459 :   ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
     293        40377 :               inner_fn_2, type.get_struct_name ());
     294        13459 : }
     295              : 
     296              : void
     297         7386 : DefaultResolver::visit (AST::EnumItem &item)
     298              : {
     299         7386 :   auto inner_fn = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
     300              : 
     301         7386 :   ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
     302              :                            inner_fn);
     303         7386 : }
     304              : 
     305              : void
     306         5091 : DefaultResolver::visit (AST::EnumItemTuple &item)
     307              : {
     308         5091 :   auto inner_fn = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
     309              : 
     310         5091 :   ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
     311              :                            inner_fn);
     312         5091 : }
     313              : 
     314              : void
     315          610 : DefaultResolver::visit (AST::EnumItemStruct &item)
     316              : {
     317          610 :   auto inner_fn = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
     318              : 
     319          610 :   ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
     320              :                            inner_fn);
     321          610 : }
     322              : 
     323              : void
     324         2181 : DefaultResolver::visit (AST::EnumItemDiscriminant &item)
     325              : {
     326         2181 :   auto inner_fn = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
     327              : 
     328         2181 :   ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
     329              :                            inner_fn);
     330         2181 : }
     331              : 
     332              : void
     333         6007 : DefaultResolver::visit (AST::Enum &type)
     334              : {
     335         6007 :   auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
     336              : 
     337        12014 :   auto inner_fn_2 = [this, &type, &inner_fn_1] () {
     338         6007 :     ctx.canonical_ctx.scope (type.get_node_id (), type.get_identifier (),
     339              :                              std::move (inner_fn_1));
     340        12014 :   };
     341              : 
     342        12014 :   ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
     343        18021 :               inner_fn_2, type.get_identifier ());
     344         6007 : }
     345              : 
     346              : void
     347          825 : DefaultResolver::visit (AST::Union &type)
     348              : {
     349          825 :   auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
     350              : 
     351         1650 :   auto inner_fn_2 = [this, &type, &inner_fn_1] () {
     352          825 :     ctx.canonical_ctx.scope (type.get_node_id (), type.get_identifier (),
     353              :                              std::move (inner_fn_1));
     354         1650 :   };
     355              : 
     356         1650 :   ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
     357         2475 :               inner_fn_2, type.get_identifier ());
     358          825 : }
     359              : 
     360              : void
     361       186894 : DefaultResolver::visit (AST::TypeAlias &type)
     362              : {
     363       186894 :   auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
     364              : 
     365       373788 :   auto inner_fn_2 = [this, &type, &inner_fn_1] () {
     366       186894 :     ctx.canonical_ctx.scope (type.get_node_id (), type.get_new_type_name (),
     367              :                              std::move (inner_fn_1));
     368       373788 :   };
     369              : 
     370       373788 :   ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
     371       560682 :               inner_fn_2, type.get_new_type_name ());
     372       186894 : }
     373              : 
     374              : void
     375        21654 : DefaultResolver::visit_closure_params (AST::ClosureExpr &expr)
     376              : {
     377        47532 :   for (auto &param : expr.get_params ())
     378        25878 :     visit (param);
     379        21654 : }
     380              : 
     381              : void
     382        21654 : DefaultResolver::visit (AST::ClosureExpr &expr)
     383              : {
     384        43308 :   auto expr_fn = [this, &expr] () {
     385        21654 :     visit_closure_params (expr);
     386        21654 :     visit (expr.get_definition_expr ());
     387        43308 :   };
     388              : 
     389        21654 :   visit_outer_attrs (expr);
     390              : 
     391        21654 :   ctx.scoped (Rib::Kind::Normal, expr.get_node_id (), expr_fn);
     392        21654 : }
     393              : 
     394              : void
     395        21402 : DefaultResolver::visit (AST::ClosureExprInner &expr)
     396              : {
     397        21402 :   if (expr.is_marked_for_strip ())
     398              :     return;
     399              : 
     400        21402 :   visit (static_cast<AST::ClosureExpr &> (expr));
     401              : }
     402              : 
     403              : void
     404          252 : DefaultResolver::visit (AST::ClosureExprInnerTyped &expr)
     405              : {
     406          252 :   if (expr.is_marked_for_strip ())
     407              :     return;
     408              : 
     409          252 :   visit (static_cast<AST::ClosureExpr &> (expr));
     410          252 :   visit (expr.get_return_type ());
     411              : }
     412              : 
     413              : void
     414       318104 : DefaultResolver::visit (AST::MatchExpr &expr)
     415              : {
     416       318104 :   if (expr.is_marked_for_strip ())
     417              :     return;
     418              : 
     419       318104 :   AST::DefaultASTVisitor::visit (expr);
     420              : }
     421              : 
     422              : void
     423      3312236 : DefaultResolver::visit (AST::MatchCase &cas)
     424              : {
     425      3312236 :   auto vis = [this, &cas] () { AST::DefaultASTVisitor::visit (cas); };
     426              : 
     427      3312236 :   ctx.scoped (Rib::Kind::Normal, cas.get_node_id (), vis);
     428      3312235 : }
     429              : 
     430              : void
     431        53916 : DefaultResolver::visit (AST::ConstantItem &item)
     432              : {
     433        53916 :   auto expr_vis_1 = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
     434              : 
     435       107832 :   auto expr_vis_2 = [this, &item, &expr_vis_1] () {
     436        53916 :     ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
     437              :                              std::move (expr_vis_1));
     438       107832 :   };
     439              : 
     440              :   // FIXME: Why do we need a Rib here?
     441        53916 :   ctx.scoped (Rib::Kind::ConstantItem, item.get_node_id (), expr_vis_2);
     442        53916 : }
     443              : 
     444              : void
     445         2933 : DefaultResolver::visit (AST::StaticItem &item)
     446              : {
     447         2933 :   auto expr_vis_1 = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
     448              : 
     449         5866 :   auto expr_vis_2 = [this, &item, &expr_vis_1] () {
     450         2933 :     ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
     451              :                              std::move (expr_vis_1));
     452         5866 :   };
     453              : 
     454              :   // FIXME: Why do we need a Rib here?
     455         2933 :   ctx.scoped (Rib::Kind::ConstantItem, item.get_node_id (), expr_vis_2);
     456         2933 : }
     457              : 
     458              : void
     459       587441 : DefaultResolver::visit (AST::TypeParam &param)
     460              : {
     461      1174882 :   auto param_ban_vis = [this, &param] () {
     462       587441 :     visit_outer_attrs (param);
     463       587441 :     if (param.has_type ())
     464         4535 :       visit (param.get_type ());
     465      1174882 :   };
     466              : 
     467       587441 :   ctx.scoped (Rib::Kind::ForwardTypeParamBan, param.get_node_id (),
     468      1174882 :               param_ban_vis);
     469              : 
     470       747281 :   for (auto &bound : param.get_type_param_bounds ())
     471       159840 :     visit (bound);
     472       587441 : }
     473              : 
     474              : void
     475          195 : DefaultResolver::visit_extern_crate (AST::ExternCrate &extern_crate,
     476              :                                      AST::Crate &crate, CrateNum num)
     477              : {
     478              :   // We do *NOT* visit the crate because loaded crates are resolved
     479              :   // independently.
     480          195 : }
     481              : 
     482              : void
     483          375 : DefaultResolver::visit (AST::ExternCrate &crate)
     484              : {
     485          375 :   auto &mappings = Analysis::Mappings::get ();
     486          375 :   tl::optional<CrateNum> num_opt;
     487          375 :   if (crate.get_referenced_crate () == "self")
     488            6 :     num_opt = mappings.get_current_crate ();
     489              :   else
     490          369 :     num_opt = mappings.lookup_crate_name (crate.get_referenced_crate ());
     491              : 
     492          375 :   if (!num_opt)
     493              :     {
     494            9 :       rust_error_at (crate.get_locus (), "unknown crate %qs",
     495            9 :                      crate.get_referenced_crate ().c_str ());
     496            9 :       return;
     497              :     }
     498              : 
     499          366 :   CrateNum num = *num_opt;
     500              : 
     501          366 :   AST::Crate &referenced_crate = mappings.get_ast_crate (num);
     502              : 
     503          366 :   auto sub_visitor_1
     504          366 :     = [&, this] () { visit_extern_crate (crate, referenced_crate, num); };
     505              : 
     506          732 :   auto sub_visitor_2 = [&] () {
     507          366 :     ctx.canonical_ctx.scope_crate (referenced_crate.get_node_id (),
     508          366 :                                    crate.get_referenced_crate () == "self"
     509            6 :                                      ? mappings.get_current_crate_name ()
     510              :                                      : crate.get_referenced_crate (),
     511              :                                    std::move (sub_visitor_1));
     512          732 :   };
     513              : 
     514          366 :   if (crate.has_as_clause ())
     515          108 :     ctx.scoped (Rib::Kind::Module, referenced_crate.get_node_id (),
     516          162 :                 sub_visitor_2, crate.get_as_clause ());
     517              :   else
     518          312 :     ctx.scoped (Rib::Kind::Module, referenced_crate.get_node_id (),
     519          936 :                 sub_visitor_2, crate.get_referenced_crate ());
     520              : }
     521              : 
     522              : } // namespace Resolver2_0
     523              : } // namespace Rust
        

Generated by: LCOV version 2.4-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.