-
Notifications
You must be signed in to change notification settings - Fork 13.5k
[clang] Add dump() support for lvalue APValues #124476
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-clang Author: Timm Baeder (tbaederr) ChangesAdd some lvalue information to the Full diff: https://github.com/llvm/llvm-project/pull/124476.diff 3 Files Affected:
diff --git a/clang/lib/AST/TextNodeDumper.cpp b/clang/lib/AST/TextNodeDumper.cpp
index 670641242cae2f..7ff758d5f78a13 100644
--- a/clang/lib/AST/TextNodeDumper.cpp
+++ b/clang/lib/AST/TextNodeDumper.cpp
@@ -710,10 +710,39 @@ void TextNodeDumper::Visit(const APValue &Value, QualType Ty) {
<< GetApproxValue(Value.getComplexFloatImag()) << 'i';
}
return;
- case APValue::LValue:
+ case APValue::LValue: {
(void)Context;
- OS << "LValue <todo>";
+ OS << "LValue Base=";
+ APValue::LValueBase B = Value.getLValueBase();
+ if (B.isNull())
+ OS << "null";
+ else if (const auto *BE = B.dyn_cast<const Expr *>()) {
+ OS << BE->getStmtClassName() << ' ';
+ dumpPointer(BE);
+ } else {
+ const auto *VDB = B.get<const ValueDecl *>();
+ OS << VDB->getDeclKindName() << "Decl";
+ dumpPointer(VDB);
+ }
+ OS << ", Null=" << Value.isNullPointer()
+ << ", Offset=" << Value.getLValueOffset().getQuantity()
+ << ", HasPath=" << Value.hasLValuePath();
+ if (Value.hasLValuePath()) {
+ OS << ", PathLength=" << Value.getLValuePath().size();
+ OS << ", Path=(";
+ bool First = true;
+ for (const auto &PathEntry : Value.getLValuePath()) {
+ // We're printing all entries as array indices because don't have the
+ // type information here to do anything else.
+ OS << PathEntry.getAsArrayIndex();
+ if (First && Value.getLValuePath().size() > 1)
+ OS << ", ";
+ First = false;
+ }
+ OS << ")";
+ }
return;
+ }
case APValue::Array: {
unsigned ArraySize = Value.getArraySize();
unsigned NumInitializedElements = Value.getArrayInitializedElts();
diff --git a/clang/test/AST/ast-dump-APValue-lvalue.cpp b/clang/test/AST/ast-dump-APValue-lvalue.cpp
new file mode 100644
index 00000000000000..2be528ba6370e7
--- /dev/null
+++ b/clang/test/AST/ast-dump-APValue-lvalue.cpp
@@ -0,0 +1,46 @@
+// Test without serialization:
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -std=gnu++17 \
+// RUN: -ast-dump %s -ast-dump-filter Test \
+// RUN: | FileCheck --strict-whitespace --match-full-lines %s
+//
+// Test with serialization:
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -std=gnu++17 -emit-pch -o %t %s
+// RUN: %clang_cc1 -x c++ -triple x86_64-unknown-unknown -Wno-unused-value -std=gnu++17 \
+// RUN: -include-pch %t -ast-dump-all -ast-dump-filter Test /dev/null \
+// RUN: | sed -e "s/ <undeserialized declarations>//" -e "s/ imported//" \
+// RUN: | FileCheck --strict-whitespace --match-full-lines %s
+
+int i;
+struct S {
+ int i;
+ int ii;
+};
+S s;
+
+struct F {
+ char padding[12];
+ S s;
+};
+F f;
+
+void Test() {
+ constexpr int *pi = &i;
+ // CHECK: | `-VarDecl {{.*}} <col:{{.*}}, col:{{.*}}> col:{{.*}} pi 'int *const' constexpr cinit
+ // CHECK-NEXT: | |-value: LValue Base=VarDecl {{.*}}, Null=0, Offset=0, HasPath=1, PathLength=0, Path=()
+
+ constexpr int *psi = &s.i;
+ // CHECK: | `-VarDecl {{.*}} <col:{{.*}}, col:{{.*}}> col:{{.*}} psi 'int *const' constexpr cinit
+ // CHECK-NEXT: | |-value: LValue Base=VarDecl {{.*}}, Null=0, Offset=0, HasPath=1, PathLength=1, Path=({{.*}})
+
+ constexpr int *psii = &s.ii;
+ // CHECK: | `-VarDecl {{.*}} <col:{{.*}}, col:{{.*}}> col:{{.*}} psii 'int *const' constexpr cinit
+ // CHECK-NEXT: | |-value: LValue Base=VarDecl {{.*}}, Null=0, Offset=4, HasPath=1, PathLength=1, Path=({{.*}})
+
+ constexpr int *pf = &f.s.ii;
+ // CHECK: | `-VarDecl {{.*}} <col:{{.*}}, col:{{.*}}> col:{{.*}} pf 'int *const' constexpr cinit
+ // CHECK-NEXT: | |-value: LValue Base=VarDecl {{.*}}, Null=0, Offset=12, HasPath=1, PathLength=2, Path=({{.*}}, {{.*}})
+
+ constexpr const int *n = nullptr;
+ // CHECK: `-VarDecl {{.*}} <col:{{.*}}, col:{{.*}}> col:{{.*}} n 'const int *const' constexpr cinit
+ // CHECK-NEXT: |-value: LValue Base=null, Null=1, Offset=0, HasPath=1, PathLength=0, Path=()
+}
diff --git a/clang/test/AST/ast-dump-APValue-todo.cpp b/clang/test/AST/ast-dump-APValue-todo.cpp
index 78cc9cf36c73c1..acaa82ba53b6fd 100644
--- a/clang/test/AST/ast-dump-APValue-todo.cpp
+++ b/clang/test/AST/ast-dump-APValue-todo.cpp
@@ -16,10 +16,6 @@ struct S {
};
void Test() {
- constexpr int *pi = &i;
- // CHECK: | `-VarDecl {{.*}} <col:{{.*}}, col:{{.*}}> col:{{.*}} pi 'int *const' constexpr cinit
- // CHECK-NEXT: | |-value: LValue <todo>
-
constexpr int(S::*pmi) = &S::i;
// CHECK: `-VarDecl {{.*}} <col:{{.*}}, col:{{.*}}> col:{{.*}} pmi 'int (S::*const)' constexpr cinit
// CHECK-NEXT: |-value: MemberPointer <todo>
|
Add some lvalue information to the `dump()` output of lvalue APValues.
@shafik Sorry, I screwed up before. The problematic APValue actually doesn't show up because the initializer is not constant. Not sure how to make the problem appear. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
Add some lvalue information to the
dump()
output of lvalue APValues.