mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-27 08:50:10 +01:00
This starts propagating is_extern on import, and warns when merging an imported non-extern declaration with a local non-extern declaration. Note this doesn't address import conflicts yet (i.e., two libraries define an equivalent name) because they don't call merge logic. On merge, I'm only setting values when new_is_definition because I think it better matches the comment and resulting behavior. Note I now set them even for bad redefinitions; I think this matches the comment, and there's not a perfect choice here. I could change the flow back if preferred. Note this puts a spotlight on invalid nodes on imported decls, which I think I'm going to need to address now. This isn't addressed by ImportRef logic directly because the Function's decl_id is a FunctionDecl, rather than the ImportRef that led to it. While I could add the ImportRef link to each decl, I think adjusting the associated NodeId is a better approach.
38 lines
1.6 KiB
C++
38 lines
1.6 KiB
C++
// 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
|
|
|
|
#ifndef CARBON_TOOLCHAIN_CHECK_FUNCTION_H_
|
|
#define CARBON_TOOLCHAIN_CHECK_FUNCTION_H_
|
|
|
|
#include "toolchain/check/context.h"
|
|
#include "toolchain/check/subst.h"
|
|
#include "toolchain/sem_ir/function.h"
|
|
|
|
namespace Carbon::Check {
|
|
|
|
// Checks that `new_function_id` has the same parameter types and return type as
|
|
// `prev_function_id`, applying the specified set of substitutions to the
|
|
// previous function. Prints a suitable diagnostic and returns false if not.
|
|
// Note that this doesn't include the syntactic check that's performed for
|
|
// redeclarations.
|
|
auto CheckFunctionTypeMatches(Context& context,
|
|
SemIR::FunctionId new_function_id,
|
|
SemIR::FunctionId prev_function_id,
|
|
Substitutions substitutions) -> bool;
|
|
|
|
// Tries to merge new_function into prev_function_id. Since new_function won't
|
|
// have a definition even if one is upcoming, set is_definition to indicate the
|
|
// planned result.
|
|
//
|
|
// If merging is successful, updates the FunctionId on new_function and returns
|
|
// true. Otherwise, returns false. Prints a diagnostic when appropriate.
|
|
auto MergeFunctionRedecl(Context& context, Parse::NodeId node_id,
|
|
SemIR::Function& new_function, bool new_is_definition,
|
|
SemIR::FunctionId prev_function_id,
|
|
bool prev_is_imported) -> bool;
|
|
|
|
} // namespace Carbon::Check
|
|
|
|
#endif // CARBON_TOOLCHAIN_CHECK_FUNCTION_H_
|