diff --git a/clang/include/clang/AST/ASTNodeTraverser.h b/clang/include/clang/AST/ASTNodeTraverser.h --- a/clang/include/clang/AST/ASTNodeTraverser.h +++ b/clang/include/clang/AST/ASTNodeTraverser.h @@ -384,7 +384,8 @@ } void VisitAttributedType(const AttributedType *T) { // FIXME: AttrKind - Visit(T->getModifiedType()); + if (T->getModifiedType() != T->getEquivalentType()) + Visit(T->getModifiedType()); } void VisitBTFTagAttributedType(const BTFTagAttributedType *T) { Visit(T->getWrappedType()); diff --git a/clang/test/AST/ast-dump-attr-type.cpp b/clang/test/AST/ast-dump-attr-type.cpp new file mode 100644 --- /dev/null +++ b/clang/test/AST/ast-dump-attr-type.cpp @@ -0,0 +1,24 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -fsyntax-only -ast-dump %s | FileCheck %s + +int * _Nonnull x; +using Ty = decltype(x); + +// CHECK: TypeAliasDecl 0x{{[^ ]*}} col:7 Ty 'decltype(x)':'int *' +// CHECK-NEXT: `-DecltypeType 0x{{[^ ]*}} 'decltype(x)' sugar +// CHECK-NEXT: |-DeclRefExpr 0x{{[^ ]*}} 'int * _Nonnull':'int *' lvalue Var 0x{{[^ ]*}} 'x' 'int * _Nonnull':'int *' non_odr_use_unevaluated +// CHECK-NEXT: `-AttributedType 0x{{[^ ]*}} 'int * _Nonnull' sugar +// CHECK-NEXT: `-PointerType 0x{{[^ ]*}} 'int *' +// CHECK-NEXT: `-BuiltinType 0x{{[^ ]*}} 'int' +// CHECK-NOT: `-PointerType + +[[clang::address_space(3)]] int *y; +using Ty1 = decltype(y); + +// CHECK: TypeAliasDecl 0x{{[^ ]*}} col:7 Ty1 'decltype(y)':'__attribute__((address_space(3))) int *' +// CHECK-NEXT: `-DecltypeType 0x{{[^ ]*}} 'decltype(y)' sugar +// CHECK-NEXT: |-DeclRefExpr 0x{{[^ ]*}} '__attribute__((address_space(3))) int *' lvalue Var 0x{{[^ ]*}} 'y' '__attribute__((address_space(3))) int *' non_odr_use_unevaluated +// CHECK-NEXT: `-PointerType 0x{{[^ ]*}} '__attribute__((address_space(3))) int *' +// CHECK-NEXT: `-AttributedType 0x{{[^ ]*}} '__attribute__((address_space(3))) int' sugar +// CHECK-NEXT |-BuiltinType 0x{{[^ ]*}} 'int' +// CHECK-NEXT `-QualType 0x{{[^ ]*}} '__attribute__((address_space(3))) int' __attribute__((address_space(3))) +// CHECK-NEXT `-BuiltinType 0x{{[^ ]*}} 'int' diff --git a/clang/test/AST/ast-dump-types-json.cpp b/clang/test/AST/ast-dump-types-json.cpp --- a/clang/test/AST/ast-dump-types-json.cpp +++ b/clang/test/AST/ast-dump-types-json.cpp @@ -203,32 +203,6 @@ // CHECK-NEXT: ] // CHECK-NEXT: } // CHECK-NEXT: ] -// CHECK-NEXT: }, -// CHECK-NEXT: { -// CHECK-NEXT: "id": "0x{{.*}}", -// CHECK-NEXT: "kind": "ParenType", -// CHECK-NEXT: "type": { -// CHECK-NEXT: "qualType": "void ()" -// CHECK-NEXT: }, -// CHECK-NEXT: "inner": [ -// CHECK-NEXT: { -// CHECK-NEXT: "id": "0x{{.*}}", -// CHECK-NEXT: "kind": "FunctionProtoType", -// CHECK-NEXT: "type": { -// CHECK-NEXT: "qualType": "void ()" -// CHECK-NEXT: }, -// CHECK-NEXT: "cc": "cdecl", -// CHECK-NEXT: "inner": [ -// CHECK-NEXT: { -// CHECK-NEXT: "id": "0x{{.*}}", -// CHECK-NEXT: "kind": "BuiltinType", -// CHECK-NEXT: "type": { -// CHECK-NEXT: "qualType": "void" -// CHECK-NEXT: } -// CHECK-NEXT: } -// CHECK-NEXT: ] -// CHECK-NEXT: } -// CHECK-NEXT: ] // CHECK-NEXT: } // CHECK-NEXT: ] // CHECK-NEXT: }