From 9245e17d4c8eb93309b9ef719c8acfaa9feecf44 Mon Sep 17 00:00:00 2001 From: Jon Ross-Perkins Date: Wed, 12 Apr 2023 09:25:43 -0700 Subject: [PATCH] Validate that the argument to __mix is a mixin. (#2757) --- explorer/interpreter/type_checker.cpp | 7 ++++++- .../testdata/mixin/fail_mix_invalid.carbon | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 explorer/testdata/mixin/fail_mix_invalid.carbon diff --git a/explorer/interpreter/type_checker.cpp b/explorer/interpreter/type_checker.cpp index 2b83783cdf11..364c2f9082ce 100644 --- a/explorer/interpreter/type_checker.cpp +++ b/explorer/interpreter/type_checker.cpp @@ -6129,7 +6129,12 @@ auto TypeChecker::DeclareDeclaration(Nonnull d, CARBON_ASSIGN_OR_RETURN( Nonnull mixin, InterpExp(&mix_decl.mixin(), arena_, trace_stream_)); - mix_decl.set_mixin_value(cast(mixin)); + if (const auto* mixin_value = dyn_cast(mixin)) { + mix_decl.set_mixin_value(mixin_value); + } else { + return ProgramError(mix_decl.source_loc()) + << "Not a valid mixin: `" << mix_decl.mixin() << "`"; + } const auto& mixin_decl = mix_decl.mixin_value().declaration(); if (!mixin_decl.is_declared()) { return ProgramError(mix_decl.source_loc()) diff --git a/explorer/testdata/mixin/fail_mix_invalid.carbon b/explorer/testdata/mixin/fail_mix_invalid.carbon new file mode 100644 index 000000000000..02acb3dcfac7 --- /dev/null +++ b/explorer/testdata/mixin/fail_mix_invalid.carbon @@ -0,0 +1,18 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// AUTOUPDATE +// RUN: %{not} %{explorer-run} +// RUN: %{not} %{explorer-run-trace} + +package ExplorerTest api; + +__mixin Mixin { + // CHECK:STDERR: COMPILATION ERROR: {{.*}}/explorer/testdata/mixin/fail_mix_invalid.carbon:[[@LINE+1]]: Not a valid mixin: `()` + __mix (); +} + +fn Main() -> i32 { + return 0; +}