[clang] Issue #19 and #20 - Describe auto (C++11) type inferences (PR #86474)
Nisarga V via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 25 01:09:08 PDT 2024
https://github.com/nisarga3 created https://github.com/llvm/llvm-project/pull/86474
None
>From 6d3343fe3894d1706baa6316d76a5277af596f91 Mon Sep 17 00:00:00 2001
From: Nisarga V <vnisarga at pe28vega.us.cray.com>
Date: Tue, 19 Mar 2024 06:35:04 -0500
Subject: [PATCH 1/2] Added 'fdump-autotype inference' option for Issue #19.
- Further refactoring in progress
---
clang/include/clang/Basic/LangOptions.def | 1 +
clang/include/clang/Driver/Options.td | 6 ++++++
clang/include/clang/Frontend/FrontendOptions.h | 6 ++++++
clang/lib/Frontend/CompilerInvocation.cpp | 7 +++++++
clang/tools/driver/cc1_main.cpp | 6 ++++++
5 files changed, 26 insertions(+)
diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def
index 472fd9f093a718..6cb262c845af8b 100644
--- a/clang/include/clang/Basic/LangOptions.def
+++ b/clang/include/clang/Basic/LangOptions.def
@@ -100,6 +100,7 @@ LANGOPT(CPlusPlus20 , 1, 0, "C++20")
LANGOPT(CPlusPlus23 , 1, 0, "C++23")
LANGOPT(CPlusPlus26 , 1, 0, "C++26")
LANGOPT(ObjC , 1, 0, "Objective-C")
+LANGOPT(DumpAutoTypeInference , 1, 0, "Dump auto type inference information")
BENIGN_LANGOPT(ObjCDefaultSynthProperties , 1, 0,
"Objective-C auto-synthesized properties")
BENIGN_LANGOPT(EncodeExtendedBlockSig , 1, 0,
diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td
index aca8c9b0d5487a..542065be3c8811 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -7474,6 +7474,12 @@ def stats_file : Joined<["-"], "stats-file=">,
def stats_file_append : Flag<["-"], "stats-file-append">,
HelpText<"If stats should be appended to stats-file instead of overwriting it">,
MarshallingInfoFlag<FrontendOpts<"AppendStats">>;
+
+def fdump_auto_type_inference : Flag<["-"], "fdump-auto-type-inference">, Group<f_Group>,
+ HelpText<"Enable dumping of auto type inference information">;
+def fno_dump_auto_type_inference : Flag<["-"], "fno-dump-auto-type-inference">,Group<f_Group>,
+ HelpText<"Disable dumping of auto type inference information">;
+
def fdump_record_layouts_simple : Flag<["-"], "fdump-record-layouts-simple">,
HelpText<"Dump record layout information in a simple form used for testing">,
MarshallingInfoFlag<LangOpts<"DumpRecordLayoutsSimple">>;
diff --git a/clang/include/clang/Frontend/FrontendOptions.h b/clang/include/clang/Frontend/FrontendOptions.h
index 8085dbcbf671a6..fac6ff18ecae69 100644
--- a/clang/include/clang/Frontend/FrontendOptions.h
+++ b/clang/include/clang/Frontend/FrontendOptions.h
@@ -134,6 +134,9 @@ enum ActionKind {
/// Run one or more source code analyses.
RunAnalysis,
+ /// for dumping auto type inference
+ DumpAutoTypeInference,
+
/// Dump template instantiations
TemplightDump,
@@ -274,6 +277,9 @@ class FrontendInputFile {
/// FrontendOptions - Options for controlling the behavior of the frontend.
class FrontendOptions {
public:
+bool DumpAutoTypeInference=false;
+bool shouldDumpAutoTypeInference() const { return DumpAutoTypeInference; }
+void setDumpAutoTypeInference(bool Value) { DumpAutoTypeInference = Value; }
/// Disable memory freeing on exit.
LLVM_PREFERRED_TYPE(bool)
unsigned DisableFree : 1;
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp
index 451bdb9386f587..17d100f8ba2aa7 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -2576,6 +2576,7 @@ static const auto &getFrontendActionTable() {
{frontend::RunPreprocessorOnly, OPT_Eonly},
{frontend::PrintDependencyDirectivesSourceMinimizerOutput,
OPT_print_dependency_directives_minimized_source},
+ {frontend::DumpAutoTypeInference, OPT_fdump_auto_type_inference},
};
return Table;
@@ -2842,6 +2843,11 @@ static bool ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,
for (const auto *AA : Args.filtered(OPT_plugin_arg))
Opts.PluginArgs[AA->getValue(0)].emplace_back(AA->getValue(1));
+ // Add custom flag handling for -fdump-auto-type-inference
+ if (Args.hasArg(OPT_fdump_auto_type_inference)) {
+ Opts.setDumpAutoTypeInference(true);
+ }
+
for (const std::string &Arg :
Args.getAllArgValues(OPT_ftest_module_file_extension_EQ)) {
std::string BlockName;
@@ -4295,6 +4301,7 @@ static bool isStrictlyPreprocessorAction(frontend::ActionKind Action) {
case frontend::RunAnalysis:
case frontend::TemplightDump:
case frontend::MigrateSource:
+ case frontend::DumpAutoTypeInference:
return false;
case frontend::DumpCompilerOptions:
diff --git a/clang/tools/driver/cc1_main.cpp b/clang/tools/driver/cc1_main.cpp
index b5c6be3c557bb3..a3e366ebcdeea1 100644
--- a/clang/tools/driver/cc1_main.cpp
+++ b/clang/tools/driver/cc1_main.cpp
@@ -191,6 +191,12 @@ int cc1_main(ArrayRef<const char *> Argv, const char *Argv0, void *MainAddr) {
bool Success = CompilerInvocation::CreateFromArgs(Clang->getInvocation(),
Argv, Diags, Argv0);
+ // Check if the '-fdump-type-auto-reference' flag is present
+ if (Success && Clang->getFrontendOpts().DumpAutoTypeInference) {
+ llvm::outs() << "Dumping type auto reference...✔\n";
+ // Add your logic to handle the flag here
+ // For example, you can traverse the AST and print information about 'auto' references
+ }
if (!Clang->getFrontendOpts().TimeTracePath.empty()) {
llvm::timeTraceProfilerInitialize(
>From ce847613f9e504c6f6e9df0f5a976c7e3fcb913b Mon Sep 17 00:00:00 2001
From: Nisarga V <ms.nisarga3 at gmail.com>
Date: Mon, 25 Mar 2024 01:59:59 -0500
Subject: [PATCH 2/2] Print the deduced type in the output
---
clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 ++
clang/lib/Sema/SemaDecl.cpp | 8 ++++++++
clang/tools/driver/cc1_main.cpp | 2 --
3 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 9b5245695153ec..c1c8e2a58d1701 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -2496,6 +2496,8 @@ def err_auto_init_list_from_c : Error<
"%select{initializer list|array}1 in C">;
def err_auto_bitfield : Error<
"cannot pass bit-field as __auto_type initializer in C">;
+def note_deduced_auto_type : Note<
+ "deduced type of %0 is %1">;
// C++1y decltype(auto) type
def err_decltype_auto_invalid : Error<
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 1f4a041e88dfff..9afa30fab19639 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -13200,6 +13200,14 @@ bool Sema::DeduceVariableDeclarationType(VarDecl *VDecl, bool DirectInit,
VDecl->setType(DeducedType);
assert(VDecl->isLinkageValid());
+ // Check if the variable declaration is in the compiled file
+ SourceManager &SM = getSourceManager();
+ SourceLocation Loc = VDecl->getLocation();
+ if (SM.isWrittenInMainFile(Loc)) {
+ // Print the deduced type for diagnostic purposes
+ llvm::outs() << "Deduced type for '" << VDecl->getNameAsString() << "': " << DeducedType.getAsString() << "\n";
+ }
+
// In ARC, infer lifetime.
if (getLangOpts().ObjCAutoRefCount && inferObjCARCLifetime(VDecl))
VDecl->setInvalidDecl();
diff --git a/clang/tools/driver/cc1_main.cpp b/clang/tools/driver/cc1_main.cpp
index a3e366ebcdeea1..065c8b8689e979 100644
--- a/clang/tools/driver/cc1_main.cpp
+++ b/clang/tools/driver/cc1_main.cpp
@@ -194,8 +194,6 @@ int cc1_main(ArrayRef<const char *> Argv, const char *Argv0, void *MainAddr) {
// Check if the '-fdump-type-auto-reference' flag is present
if (Success && Clang->getFrontendOpts().DumpAutoTypeInference) {
llvm::outs() << "Dumping type auto reference...✔\n";
- // Add your logic to handle the flag here
- // For example, you can traverse the AST and print information about 'auto' references
}
if (!Clang->getFrontendOpts().TimeTracePath.empty()) {
More information about the cfe-commits
mailing list