Skip to content

Commit

Permalink
[clang][AST] TextNodeDumper should not evaluate the initializer of co…
Browse files Browse the repository at this point in the history
…nstexpr variable declaration when it has a dependent type

`TextNodeDumper` enabed through `-ast-dump` flag should not evlauate the initializer when it visits a constexpr `VarDecl` node if it has a dependent type.

I found a crashing case fixed by this change and added it as a test case.
`template <typename T> constexpr T call_init(0);`
Link: https://godbolt.org/z/3bG9Pjj5E

This is a fix for the regression caused by D146358

Differential Revision: https://reviews.llvm.org/D151033
  • Loading branch information
hazohelet committed May 22, 2023
1 parent 6b50e87 commit 986cbd8
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 1 deletion.
2 changes: 2 additions & 0 deletions clang/docs/ReleaseNotes.rst
Expand Up @@ -420,6 +420,8 @@ Bug Fixes in This Version
(`#62711 <https://github.com/llvm/llvm-project/issues/62711>`_).
- Fix crash on attempt to initialize union with flexible array member.
(`#61746 <https://github.com/llvm/llvm-project/issues/61746>`_).
- Clang `TextNodeDumper` enabled through `-ast-dump` flag no longer evaluates the
initializer of constexpr `VarDecl` if the declaration has a dependent type.

Bug Fixes to Compiler Builtins
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Expand Down
3 changes: 2 additions & 1 deletion clang/lib/AST/TextNodeDumper.cpp
Expand Up @@ -1821,7 +1821,8 @@ void TextNodeDumper::VisitVarDecl(const VarDecl *D) {
if (D->hasInit()) {
const Expr *E = D->getInit();
// Only dump the value of constexpr VarDecls for now.
if (E && !E->isValueDependent() && D->isConstexpr()) {
if (E && !E->isValueDependent() && D->isConstexpr() &&
!D->getType()->isDependentType()) {
const APValue *Value = D->evaluateValue();
if (Value)
AddChild("value", [=] { Visit(*Value, E->getType()); });
Expand Down
35 changes: 35 additions & 0 deletions clang/test/AST/ast-dump-decl.cpp
Expand Up @@ -818,3 +818,38 @@ namespace Comment {
// CHECK: `-TextComment
// CHECK: VarDecl {{.*}} Test 'int' extern
// CHECK-NOT: FullComment

namespace TestConstexprVariableTemplateWithInitializer {
template<typename T> constexpr T foo{};
// CHECK: VarTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-1]]:3, col:40> col:36 foo
// CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 referenced typename depth 0 index 0 T
// CHECK-NEXT: `-VarDecl 0x{{.+}} <col:24, col:40> col:36 foo 'const T' constexpr listinit
// CHECK-NEXT: `-InitListExpr 0x{{.+}} <col:39, col:40> 'void'

template<typename T> constexpr int val{42};
// CHECK: VarTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-1]]:3, col:44> col:38 val
// CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 typename depth 0 index 0 T
// CHECK-NEXT: `-VarDecl 0x{{.+}} <col:24, col:44> col:38 val 'const int' constexpr listinit
// CHECK-NEXT: |-value: Int 42
// CHECK-NEXT: `-InitListExpr 0x{{.+}} <col:41, col:44> 'int'

template <typename _Tp>
struct in_place_type_t {
explicit in_place_type_t() = default;
};

template <typename _Tp>
inline constexpr in_place_type_t<_Tp> in_place_type{};
// CHECK: -VarTemplateDecl 0x{{.+}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:55> col:41 in_place_type
// CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <line:[[@LINE-3]]:13, col:22> col:22 referenced typename depth 0 index 0 _Tp
// CHECK-NEXT: `-VarDecl 0x{{.+}} <line:[[@LINE-3]]:3, col:55> col:41 in_place_type 'const in_place_type_t<_Tp>':'const in_place_type_t<_Tp>' inline constexpr listinit
// CHECK-NEXT: `-InitListExpr 0x{{.+}} <col:54, col:55> 'void'

template <typename T> constexpr T call_init(0);
// CHECK: -VarTemplateDecl 0x{{.+}} <line:[[@LINE-1]]:3, col:48> col:37 call_init
// CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <col:13, col:22> col:22 referenced typename depth 0 index 0 T
// CHECK-NEXT: `-VarDecl 0x{{.+}} <col:25, col:48> col:37 call_init 'const T' constexpr callinit
// CHECK-NEXT: `-ParenListExpr 0x{{.+}} <col:46, col:48> 'NULL TYPE'
// CHECK-NEXT: `-IntegerLiteral 0x{{.+}} <col:47> 'int' 0

}

0 comments on commit 986cbd8

Please sign in to comment.