From 7f5e7ff8d808792a82a094c00b065df5a849a460 Mon Sep 17 00:00:00 2001 From: anutosh491 Date: Wed, 29 Oct 2025 15:48:46 +0530 Subject: [PATCH 1/3] Fix struct value printing for clang-repl in C mode --- .../lib/Interpreter/InterpreterValuePrinter.cpp | 4 ++-- clang/test/Interpreter/pretty-print.c | 16 +++++++++------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/clang/lib/Interpreter/InterpreterValuePrinter.cpp b/clang/lib/Interpreter/InterpreterValuePrinter.cpp index 0ed02f3bfabe8..1e9777f3485c6 100644 --- a/clang/lib/Interpreter/InterpreterValuePrinter.cpp +++ b/clang/lib/Interpreter/InterpreterValuePrinter.cpp @@ -411,7 +411,7 @@ class InterfaceKindVisitor } InterfaceKind VisitReferenceType(const ReferenceType *Ty) { - ExprResult AddrOfE = S.CreateBuiltinUnaryOp(SourceLocation(), UO_AddrOf, E); + ExprResult AddrOfE = S.CreateBuiltinUnaryOp(SourceLocation(), UO_AddrOf, E->IgnoreImpCasts()); assert(!AddrOfE.isInvalid() && "Can not create unary expression"); Args.push_back(AddrOfE.get()); return InterfaceKind::NoAlloc; @@ -537,7 +537,7 @@ llvm::Expected Interpreter::convertExprToValue(Expr *E) { QualType DesugaredTy = Ty.getDesugaredType(Ctx); // For lvalue struct, we treat it as a reference. - if (DesugaredTy->isRecordType() && E->isLValue()) { + if (DesugaredTy->isRecordType() && E->IgnoreImpCasts()->isLValue()) { DesugaredTy = Ctx.getLValueReferenceType(DesugaredTy); Ty = Ctx.getLValueReferenceType(Ty); } diff --git a/clang/test/Interpreter/pretty-print.c b/clang/test/Interpreter/pretty-print.c index d0712fb152107..c752b53b5264a 100644 --- a/clang/test/Interpreter/pretty-print.c +++ b/clang/test/Interpreter/pretty-print.c @@ -78,14 +78,16 @@ int * null_ptr = (int*)0; null_ptr union U { int I; float F; } u; u.I = 12; u.I // CHECK-NEXT: (int) 12 -// TODO: _Bool, _Complex, _Atomic, and _BitInt -// struct S1{} s1; s1 -// TODO-CHECK-NEXT: (S1 &) @0x{{[0-9a-f]+}} +struct S1{} s1; s1 +// CHECK-NEXT: (S1 &) @0x{{[0-9a-f]+}} + +struct S2 {int d;} E = {22}; E +// CHECK-NEXT: (struct S2 &) @0x{{[0-9a-f]+}} -// struct S2 {int d;} E = {22}; E -// TODO-CHECK-NEXT: (struct S2 &) @0x{{[0-9a-f]+}} -// E.d -// TODO-CHECK-NEXT: (int) 22 +E.d +// CHECK-NEXT: (int) 22 + +// TODO: _Bool, _Complex, _Atomic, and _BitInt // ----------------------------------------------------------------------------- // Tentative definition handling (C99 6.9.2) From 7ef2e36e4ac13180ad9b65e94f2d6488c6d76bb8 Mon Sep 17 00:00:00 2001 From: anutosh491 Date: Wed, 29 Oct 2025 16:05:06 +0530 Subject: [PATCH 2/3] Formatting --- clang/lib/Interpreter/InterpreterValuePrinter.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/clang/lib/Interpreter/InterpreterValuePrinter.cpp b/clang/lib/Interpreter/InterpreterValuePrinter.cpp index 1e9777f3485c6..cfa50ee908bf8 100644 --- a/clang/lib/Interpreter/InterpreterValuePrinter.cpp +++ b/clang/lib/Interpreter/InterpreterValuePrinter.cpp @@ -411,7 +411,8 @@ class InterfaceKindVisitor } InterfaceKind VisitReferenceType(const ReferenceType *Ty) { - ExprResult AddrOfE = S.CreateBuiltinUnaryOp(SourceLocation(), UO_AddrOf, E->IgnoreImpCasts()); + ExprResult AddrOfE = S.CreateBuiltinUnaryOp(SourceLocation(), UO_AddrOf, + E->IgnoreImpCasts()); assert(!AddrOfE.isInvalid() && "Can not create unary expression"); Args.push_back(AddrOfE.get()); return InterfaceKind::NoAlloc; From 0e87b97b875c51e2c46076b7dcf5d7124302a873 Mon Sep 17 00:00:00 2001 From: anutosh491 Date: Wed, 29 Oct 2025 16:17:56 +0530 Subject: [PATCH 3/3] fix failing test --- clang/test/Interpreter/pretty-print.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/test/Interpreter/pretty-print.c b/clang/test/Interpreter/pretty-print.c index c752b53b5264a..9a7bf752238ab 100644 --- a/clang/test/Interpreter/pretty-print.c +++ b/clang/test/Interpreter/pretty-print.c @@ -82,7 +82,7 @@ struct S1{} s1; s1 // CHECK-NEXT: (S1 &) @0x{{[0-9a-f]+}} struct S2 {int d;} E = {22}; E -// CHECK-NEXT: (struct S2 &) @0x{{[0-9a-f]+}} +// CHECK-NEXT: (S2 &) @0x{{[0-9a-f]+}} E.d // CHECK-NEXT: (int) 22