[AST] Print correct tag decl for tag specifier
For example, given:
void fn() {
struct T *p0;
struct T { int i; } *p1;
}
-ast-print produced:
void fn() {
struct T { int i; } *p0;
struct T { int i; } *p1;
}
Compiling that fails with a redefinition error.
Given:
void fn() {
struct T *p0;
struct __attribute__((deprecated)) T *p1;
}
-ast-print dropped the attribute.
Details:
For a tag specifier (that is, struct/union/class/enum used as a type
specifier in a declaration) that was also a tag declaration (that is,
first occurrence of the tag) or tag redeclaration (that is, later
occurrence that specifies attributes or a member list), clang printed
the tag specifier as either (1) the full tag definition if one
existed, or (2) the first tag declaration otherwise. Redefinition
errors were sometimes introduced, as in the first example above. Even
when that was impossible because no member list was ever specified,
attributes were sometimes lost, thus changing semantics and
diagnostics, as in the second example above.
This patch fixes a major culprit for these problems. It does so by
creating an ElaboratedType with a new OwnedDecl member wherever an
occurrence of a tag type is a (re)declaration of that tag type.
PrintingPolicy's IncludeTagDefinition used to trigger printing of the
member list, attributes, etc. for a tag specifier by using a tag
(re)declaration selected as described above. Now, it triggers the
same thing except it uses the tag (re)declaration stored in the
OwnedDecl. Of course, other tooling can now make use of the new
OwnedDecl as well.
Also, to be more faithful to the original source, this patch
suppresses printing of attributes inherited from previous
declarations.
Reviewed by: rsmith, aaron.ballman
Differential Revision: https://reviews.llvm.org/D45463
llvm-svn: 332281
2018-05-15 03:36:45 +08:00
|
|
|
// Check struct:
|
|
|
|
//
|
|
|
|
// First check compiling and printing of this file.
|
|
|
|
//
|
2018-05-15 05:06:04 +08:00
|
|
|
// RUN: %clang -target x86_64-linux -Xclang -verify -S -emit-llvm \
|
|
|
|
// RUN: -DKW=struct -DBASES= -o - %s \
|
[AST] Print correct tag decl for tag specifier
For example, given:
void fn() {
struct T *p0;
struct T { int i; } *p1;
}
-ast-print produced:
void fn() {
struct T { int i; } *p0;
struct T { int i; } *p1;
}
Compiling that fails with a redefinition error.
Given:
void fn() {
struct T *p0;
struct __attribute__((deprecated)) T *p1;
}
-ast-print dropped the attribute.
Details:
For a tag specifier (that is, struct/union/class/enum used as a type
specifier in a declaration) that was also a tag declaration (that is,
first occurrence of the tag) or tag redeclaration (that is, later
occurrence that specifies attributes or a member list), clang printed
the tag specifier as either (1) the full tag definition if one
existed, or (2) the first tag declaration otherwise. Redefinition
errors were sometimes introduced, as in the first example above. Even
when that was impossible because no member list was ever specified,
attributes were sometimes lost, thus changing semantics and
diagnostics, as in the second example above.
This patch fixes a major culprit for these problems. It does so by
creating an ElaboratedType with a new OwnedDecl member wherever an
occurrence of a tag type is a (re)declaration of that tag type.
PrintingPolicy's IncludeTagDefinition used to trigger printing of the
member list, attributes, etc. for a tag specifier by using a tag
(re)declaration selected as described above. Now, it triggers the
same thing except it uses the tag (re)declaration stored in the
OwnedDecl. Of course, other tooling can now make use of the new
OwnedDecl as well.
Also, to be more faithful to the original source, this patch
suppresses printing of attributes inherited from previous
declarations.
Reviewed by: rsmith, aaron.ballman
Differential Revision: https://reviews.llvm.org/D45463
llvm-svn: 332281
2018-05-15 03:36:45 +08:00
|
|
|
// RUN: | FileCheck --check-prefixes=CHECK,LLVM %s
|
|
|
|
//
|
|
|
|
// RUN: %clang_cc1 -verify -ast-print -DKW=struct -DBASES= %s > %t.c
|
2020-11-01 12:46:45 +08:00
|
|
|
// RUN: FileCheck --check-prefixes=CHECK,PRINT -DKW=struct -DBASES= \
|
2018-05-15 08:44:14 +08:00
|
|
|
// RUN: %s --input-file %t.c
|
[AST] Print correct tag decl for tag specifier
For example, given:
void fn() {
struct T *p0;
struct T { int i; } *p1;
}
-ast-print produced:
void fn() {
struct T { int i; } *p0;
struct T { int i; } *p1;
}
Compiling that fails with a redefinition error.
Given:
void fn() {
struct T *p0;
struct __attribute__((deprecated)) T *p1;
}
-ast-print dropped the attribute.
Details:
For a tag specifier (that is, struct/union/class/enum used as a type
specifier in a declaration) that was also a tag declaration (that is,
first occurrence of the tag) or tag redeclaration (that is, later
occurrence that specifies attributes or a member list), clang printed
the tag specifier as either (1) the full tag definition if one
existed, or (2) the first tag declaration otherwise. Redefinition
errors were sometimes introduced, as in the first example above. Even
when that was impossible because no member list was ever specified,
attributes were sometimes lost, thus changing semantics and
diagnostics, as in the second example above.
This patch fixes a major culprit for these problems. It does so by
creating an ElaboratedType with a new OwnedDecl member wherever an
occurrence of a tag type is a (re)declaration of that tag type.
PrintingPolicy's IncludeTagDefinition used to trigger printing of the
member list, attributes, etc. for a tag specifier by using a tag
(re)declaration selected as described above. Now, it triggers the
same thing except it uses the tag (re)declaration stored in the
OwnedDecl. Of course, other tooling can now make use of the new
OwnedDecl as well.
Also, to be more faithful to the original source, this patch
suppresses printing of attributes inherited from previous
declarations.
Reviewed by: rsmith, aaron.ballman
Differential Revision: https://reviews.llvm.org/D45463
llvm-svn: 332281
2018-05-15 03:36:45 +08:00
|
|
|
//
|
|
|
|
// Now check compiling and printing of the printed file.
|
|
|
|
//
|
|
|
|
// RUN: echo "// expected""-warning@* 10 {{'T' is deprecated}}" >> %t.c
|
|
|
|
// RUN: echo "// expected""-note@* 10 {{'T' has been explicitly marked deprecated here}}" >> %t.c
|
|
|
|
//
|
2018-05-15 05:06:04 +08:00
|
|
|
// RUN: %clang -target x86_64-linux -Xclang -verify -S -emit-llvm -o - %t.c \
|
[AST] Print correct tag decl for tag specifier
For example, given:
void fn() {
struct T *p0;
struct T { int i; } *p1;
}
-ast-print produced:
void fn() {
struct T { int i; } *p0;
struct T { int i; } *p1;
}
Compiling that fails with a redefinition error.
Given:
void fn() {
struct T *p0;
struct __attribute__((deprecated)) T *p1;
}
-ast-print dropped the attribute.
Details:
For a tag specifier (that is, struct/union/class/enum used as a type
specifier in a declaration) that was also a tag declaration (that is,
first occurrence of the tag) or tag redeclaration (that is, later
occurrence that specifies attributes or a member list), clang printed
the tag specifier as either (1) the full tag definition if one
existed, or (2) the first tag declaration otherwise. Redefinition
errors were sometimes introduced, as in the first example above. Even
when that was impossible because no member list was ever specified,
attributes were sometimes lost, thus changing semantics and
diagnostics, as in the second example above.
This patch fixes a major culprit for these problems. It does so by
creating an ElaboratedType with a new OwnedDecl member wherever an
occurrence of a tag type is a (re)declaration of that tag type.
PrintingPolicy's IncludeTagDefinition used to trigger printing of the
member list, attributes, etc. for a tag specifier by using a tag
(re)declaration selected as described above. Now, it triggers the
same thing except it uses the tag (re)declaration stored in the
OwnedDecl. Of course, other tooling can now make use of the new
OwnedDecl as well.
Also, to be more faithful to the original source, this patch
suppresses printing of attributes inherited from previous
declarations.
Reviewed by: rsmith, aaron.ballman
Differential Revision: https://reviews.llvm.org/D45463
llvm-svn: 332281
2018-05-15 03:36:45 +08:00
|
|
|
// RUN: | FileCheck --check-prefixes=CHECK,LLVM %s
|
|
|
|
//
|
|
|
|
// RUN: %clang_cc1 -verify -ast-print %t.c \
|
2020-11-01 12:46:45 +08:00
|
|
|
// RUN: | FileCheck --check-prefixes=CHECK,PRINT -DKW=struct \
|
2018-05-15 08:44:14 +08:00
|
|
|
// RUN: -DBASES= %s
|
[AST] Print correct tag decl for tag specifier
For example, given:
void fn() {
struct T *p0;
struct T { int i; } *p1;
}
-ast-print produced:
void fn() {
struct T { int i; } *p0;
struct T { int i; } *p1;
}
Compiling that fails with a redefinition error.
Given:
void fn() {
struct T *p0;
struct __attribute__((deprecated)) T *p1;
}
-ast-print dropped the attribute.
Details:
For a tag specifier (that is, struct/union/class/enum used as a type
specifier in a declaration) that was also a tag declaration (that is,
first occurrence of the tag) or tag redeclaration (that is, later
occurrence that specifies attributes or a member list), clang printed
the tag specifier as either (1) the full tag definition if one
existed, or (2) the first tag declaration otherwise. Redefinition
errors were sometimes introduced, as in the first example above. Even
when that was impossible because no member list was ever specified,
attributes were sometimes lost, thus changing semantics and
diagnostics, as in the second example above.
This patch fixes a major culprit for these problems. It does so by
creating an ElaboratedType with a new OwnedDecl member wherever an
occurrence of a tag type is a (re)declaration of that tag type.
PrintingPolicy's IncludeTagDefinition used to trigger printing of the
member list, attributes, etc. for a tag specifier by using a tag
(re)declaration selected as described above. Now, it triggers the
same thing except it uses the tag (re)declaration stored in the
OwnedDecl. Of course, other tooling can now make use of the new
OwnedDecl as well.
Also, to be more faithful to the original source, this patch
suppresses printing of attributes inherited from previous
declarations.
Reviewed by: rsmith, aaron.ballman
Differential Revision: https://reviews.llvm.org/D45463
llvm-svn: 332281
2018-05-15 03:36:45 +08:00
|
|
|
|
|
|
|
// Repeat for union:
|
|
|
|
//
|
|
|
|
// First check compiling and printing of this file.
|
|
|
|
//
|
2018-05-15 05:06:04 +08:00
|
|
|
// RUN: %clang -target x86_64-linux -Xclang -verify -S -emit-llvm \
|
|
|
|
// RUN: -DKW=union -DBASES= -o - %s \
|
[AST] Print correct tag decl for tag specifier
For example, given:
void fn() {
struct T *p0;
struct T { int i; } *p1;
}
-ast-print produced:
void fn() {
struct T { int i; } *p0;
struct T { int i; } *p1;
}
Compiling that fails with a redefinition error.
Given:
void fn() {
struct T *p0;
struct __attribute__((deprecated)) T *p1;
}
-ast-print dropped the attribute.
Details:
For a tag specifier (that is, struct/union/class/enum used as a type
specifier in a declaration) that was also a tag declaration (that is,
first occurrence of the tag) or tag redeclaration (that is, later
occurrence that specifies attributes or a member list), clang printed
the tag specifier as either (1) the full tag definition if one
existed, or (2) the first tag declaration otherwise. Redefinition
errors were sometimes introduced, as in the first example above. Even
when that was impossible because no member list was ever specified,
attributes were sometimes lost, thus changing semantics and
diagnostics, as in the second example above.
This patch fixes a major culprit for these problems. It does so by
creating an ElaboratedType with a new OwnedDecl member wherever an
occurrence of a tag type is a (re)declaration of that tag type.
PrintingPolicy's IncludeTagDefinition used to trigger printing of the
member list, attributes, etc. for a tag specifier by using a tag
(re)declaration selected as described above. Now, it triggers the
same thing except it uses the tag (re)declaration stored in the
OwnedDecl. Of course, other tooling can now make use of the new
OwnedDecl as well.
Also, to be more faithful to the original source, this patch
suppresses printing of attributes inherited from previous
declarations.
Reviewed by: rsmith, aaron.ballman
Differential Revision: https://reviews.llvm.org/D45463
llvm-svn: 332281
2018-05-15 03:36:45 +08:00
|
|
|
// RUN: | FileCheck --check-prefixes=CHECK,LLVM %s
|
|
|
|
//
|
|
|
|
// RUN: %clang_cc1 -verify -ast-print -DKW=union -DBASES= %s > %t.c
|
2020-11-01 12:46:45 +08:00
|
|
|
// RUN: FileCheck --check-prefixes=CHECK,PRINT -DKW=union -DBASES= \
|
2018-05-15 08:44:14 +08:00
|
|
|
// RUN: %s --input-file %t.c
|
[AST] Print correct tag decl for tag specifier
For example, given:
void fn() {
struct T *p0;
struct T { int i; } *p1;
}
-ast-print produced:
void fn() {
struct T { int i; } *p0;
struct T { int i; } *p1;
}
Compiling that fails with a redefinition error.
Given:
void fn() {
struct T *p0;
struct __attribute__((deprecated)) T *p1;
}
-ast-print dropped the attribute.
Details:
For a tag specifier (that is, struct/union/class/enum used as a type
specifier in a declaration) that was also a tag declaration (that is,
first occurrence of the tag) or tag redeclaration (that is, later
occurrence that specifies attributes or a member list), clang printed
the tag specifier as either (1) the full tag definition if one
existed, or (2) the first tag declaration otherwise. Redefinition
errors were sometimes introduced, as in the first example above. Even
when that was impossible because no member list was ever specified,
attributes were sometimes lost, thus changing semantics and
diagnostics, as in the second example above.
This patch fixes a major culprit for these problems. It does so by
creating an ElaboratedType with a new OwnedDecl member wherever an
occurrence of a tag type is a (re)declaration of that tag type.
PrintingPolicy's IncludeTagDefinition used to trigger printing of the
member list, attributes, etc. for a tag specifier by using a tag
(re)declaration selected as described above. Now, it triggers the
same thing except it uses the tag (re)declaration stored in the
OwnedDecl. Of course, other tooling can now make use of the new
OwnedDecl as well.
Also, to be more faithful to the original source, this patch
suppresses printing of attributes inherited from previous
declarations.
Reviewed by: rsmith, aaron.ballman
Differential Revision: https://reviews.llvm.org/D45463
llvm-svn: 332281
2018-05-15 03:36:45 +08:00
|
|
|
//
|
|
|
|
// Now check compiling and printing of the printed file.
|
|
|
|
//
|
|
|
|
// RUN: echo "// expected""-warning@* 10 {{'T' is deprecated}}" >> %t.c
|
|
|
|
// RUN: echo "// expected""-note@* 10 {{'T' has been explicitly marked deprecated here}}" >> %t.c
|
|
|
|
//
|
2018-05-15 05:06:04 +08:00
|
|
|
// RUN: %clang -target x86_64-linux -Xclang -verify -S -emit-llvm -o - %t.c \
|
[AST] Print correct tag decl for tag specifier
For example, given:
void fn() {
struct T *p0;
struct T { int i; } *p1;
}
-ast-print produced:
void fn() {
struct T { int i; } *p0;
struct T { int i; } *p1;
}
Compiling that fails with a redefinition error.
Given:
void fn() {
struct T *p0;
struct __attribute__((deprecated)) T *p1;
}
-ast-print dropped the attribute.
Details:
For a tag specifier (that is, struct/union/class/enum used as a type
specifier in a declaration) that was also a tag declaration (that is,
first occurrence of the tag) or tag redeclaration (that is, later
occurrence that specifies attributes or a member list), clang printed
the tag specifier as either (1) the full tag definition if one
existed, or (2) the first tag declaration otherwise. Redefinition
errors were sometimes introduced, as in the first example above. Even
when that was impossible because no member list was ever specified,
attributes were sometimes lost, thus changing semantics and
diagnostics, as in the second example above.
This patch fixes a major culprit for these problems. It does so by
creating an ElaboratedType with a new OwnedDecl member wherever an
occurrence of a tag type is a (re)declaration of that tag type.
PrintingPolicy's IncludeTagDefinition used to trigger printing of the
member list, attributes, etc. for a tag specifier by using a tag
(re)declaration selected as described above. Now, it triggers the
same thing except it uses the tag (re)declaration stored in the
OwnedDecl. Of course, other tooling can now make use of the new
OwnedDecl as well.
Also, to be more faithful to the original source, this patch
suppresses printing of attributes inherited from previous
declarations.
Reviewed by: rsmith, aaron.ballman
Differential Revision: https://reviews.llvm.org/D45463
llvm-svn: 332281
2018-05-15 03:36:45 +08:00
|
|
|
// RUN: | FileCheck --check-prefixes=CHECK,LLVM %s
|
|
|
|
//
|
|
|
|
// RUN: %clang_cc1 -verify -ast-print %t.c \
|
2020-11-01 12:46:45 +08:00
|
|
|
// RUN: | FileCheck --check-prefixes=CHECK,PRINT -DKW=union \
|
2018-05-15 08:44:14 +08:00
|
|
|
// RUN: -DBASES= %s
|
[AST] Print correct tag decl for tag specifier
For example, given:
void fn() {
struct T *p0;
struct T { int i; } *p1;
}
-ast-print produced:
void fn() {
struct T { int i; } *p0;
struct T { int i; } *p1;
}
Compiling that fails with a redefinition error.
Given:
void fn() {
struct T *p0;
struct __attribute__((deprecated)) T *p1;
}
-ast-print dropped the attribute.
Details:
For a tag specifier (that is, struct/union/class/enum used as a type
specifier in a declaration) that was also a tag declaration (that is,
first occurrence of the tag) or tag redeclaration (that is, later
occurrence that specifies attributes or a member list), clang printed
the tag specifier as either (1) the full tag definition if one
existed, or (2) the first tag declaration otherwise. Redefinition
errors were sometimes introduced, as in the first example above. Even
when that was impossible because no member list was ever specified,
attributes were sometimes lost, thus changing semantics and
diagnostics, as in the second example above.
This patch fixes a major culprit for these problems. It does so by
creating an ElaboratedType with a new OwnedDecl member wherever an
occurrence of a tag type is a (re)declaration of that tag type.
PrintingPolicy's IncludeTagDefinition used to trigger printing of the
member list, attributes, etc. for a tag specifier by using a tag
(re)declaration selected as described above. Now, it triggers the
same thing except it uses the tag (re)declaration stored in the
OwnedDecl. Of course, other tooling can now make use of the new
OwnedDecl as well.
Also, to be more faithful to the original source, this patch
suppresses printing of attributes inherited from previous
declarations.
Reviewed by: rsmith, aaron.ballman
Differential Revision: https://reviews.llvm.org/D45463
llvm-svn: 332281
2018-05-15 03:36:45 +08:00
|
|
|
|
|
|
|
// Repeat for C++ (BASES helps ensure we're printing as C++ not as C):
|
|
|
|
//
|
|
|
|
// First check compiling and printing of this file.
|
|
|
|
//
|
2018-05-15 05:06:04 +08:00
|
|
|
// RUN: %clang -target x86_64-linux -Xclang -verify -S -emit-llvm \
|
|
|
|
// RUN: -DKW=struct -DBASES=' : B' -o - -xc++ %s \
|
[AST] Print correct tag decl for tag specifier
For example, given:
void fn() {
struct T *p0;
struct T { int i; } *p1;
}
-ast-print produced:
void fn() {
struct T { int i; } *p0;
struct T { int i; } *p1;
}
Compiling that fails with a redefinition error.
Given:
void fn() {
struct T *p0;
struct __attribute__((deprecated)) T *p1;
}
-ast-print dropped the attribute.
Details:
For a tag specifier (that is, struct/union/class/enum used as a type
specifier in a declaration) that was also a tag declaration (that is,
first occurrence of the tag) or tag redeclaration (that is, later
occurrence that specifies attributes or a member list), clang printed
the tag specifier as either (1) the full tag definition if one
existed, or (2) the first tag declaration otherwise. Redefinition
errors were sometimes introduced, as in the first example above. Even
when that was impossible because no member list was ever specified,
attributes were sometimes lost, thus changing semantics and
diagnostics, as in the second example above.
This patch fixes a major culprit for these problems. It does so by
creating an ElaboratedType with a new OwnedDecl member wherever an
occurrence of a tag type is a (re)declaration of that tag type.
PrintingPolicy's IncludeTagDefinition used to trigger printing of the
member list, attributes, etc. for a tag specifier by using a tag
(re)declaration selected as described above. Now, it triggers the
same thing except it uses the tag (re)declaration stored in the
OwnedDecl. Of course, other tooling can now make use of the new
OwnedDecl as well.
Also, to be more faithful to the original source, this patch
suppresses printing of attributes inherited from previous
declarations.
Reviewed by: rsmith, aaron.ballman
Differential Revision: https://reviews.llvm.org/D45463
llvm-svn: 332281
2018-05-15 03:36:45 +08:00
|
|
|
// RUN: | FileCheck --check-prefixes=CHECK,LLVM %s
|
|
|
|
//
|
2018-05-16 06:16:47 +08:00
|
|
|
// RUN: %clang_cc1 -verify -ast-print -DKW=struct -DBASES=' : B' -xc++ %s \
|
|
|
|
// RUN: > %t.cpp
|
2018-05-15 08:44:14 +08:00
|
|
|
// RUN: FileCheck --check-prefixes=CHECK,PRINT,PRINT-CXX -DKW=struct \
|
[AST] Print correct tag decl for tag specifier
For example, given:
void fn() {
struct T *p0;
struct T { int i; } *p1;
}
-ast-print produced:
void fn() {
struct T { int i; } *p0;
struct T { int i; } *p1;
}
Compiling that fails with a redefinition error.
Given:
void fn() {
struct T *p0;
struct __attribute__((deprecated)) T *p1;
}
-ast-print dropped the attribute.
Details:
For a tag specifier (that is, struct/union/class/enum used as a type
specifier in a declaration) that was also a tag declaration (that is,
first occurrence of the tag) or tag redeclaration (that is, later
occurrence that specifies attributes or a member list), clang printed
the tag specifier as either (1) the full tag definition if one
existed, or (2) the first tag declaration otherwise. Redefinition
errors were sometimes introduced, as in the first example above. Even
when that was impossible because no member list was ever specified,
attributes were sometimes lost, thus changing semantics and
diagnostics, as in the second example above.
This patch fixes a major culprit for these problems. It does so by
creating an ElaboratedType with a new OwnedDecl member wherever an
occurrence of a tag type is a (re)declaration of that tag type.
PrintingPolicy's IncludeTagDefinition used to trigger printing of the
member list, attributes, etc. for a tag specifier by using a tag
(re)declaration selected as described above. Now, it triggers the
same thing except it uses the tag (re)declaration stored in the
OwnedDecl. Of course, other tooling can now make use of the new
OwnedDecl as well.
Also, to be more faithful to the original source, this patch
suppresses printing of attributes inherited from previous
declarations.
Reviewed by: rsmith, aaron.ballman
Differential Revision: https://reviews.llvm.org/D45463
llvm-svn: 332281
2018-05-15 03:36:45 +08:00
|
|
|
// RUN: -DBASES=' : B' %s --input-file %t.cpp
|
|
|
|
//
|
|
|
|
// Now check compiling and printing of the printed file.
|
|
|
|
//
|
2018-05-16 06:16:47 +08:00
|
|
|
// RUN: echo "// expected""-warning@* 10 {{'T' is deprecated}}" > %t.diags
|
|
|
|
// RUN: echo "// expected""-note@* 10 {{'T' has been explicitly marked deprecated here}}" >> %t.diags
|
|
|
|
// RUN: cat %t.diags >> %t.cpp
|
[AST] Print correct tag decl for tag specifier
For example, given:
void fn() {
struct T *p0;
struct T { int i; } *p1;
}
-ast-print produced:
void fn() {
struct T { int i; } *p0;
struct T { int i; } *p1;
}
Compiling that fails with a redefinition error.
Given:
void fn() {
struct T *p0;
struct __attribute__((deprecated)) T *p1;
}
-ast-print dropped the attribute.
Details:
For a tag specifier (that is, struct/union/class/enum used as a type
specifier in a declaration) that was also a tag declaration (that is,
first occurrence of the tag) or tag redeclaration (that is, later
occurrence that specifies attributes or a member list), clang printed
the tag specifier as either (1) the full tag definition if one
existed, or (2) the first tag declaration otherwise. Redefinition
errors were sometimes introduced, as in the first example above. Even
when that was impossible because no member list was ever specified,
attributes were sometimes lost, thus changing semantics and
diagnostics, as in the second example above.
This patch fixes a major culprit for these problems. It does so by
creating an ElaboratedType with a new OwnedDecl member wherever an
occurrence of a tag type is a (re)declaration of that tag type.
PrintingPolicy's IncludeTagDefinition used to trigger printing of the
member list, attributes, etc. for a tag specifier by using a tag
(re)declaration selected as described above. Now, it triggers the
same thing except it uses the tag (re)declaration stored in the
OwnedDecl. Of course, other tooling can now make use of the new
OwnedDecl as well.
Also, to be more faithful to the original source, this patch
suppresses printing of attributes inherited from previous
declarations.
Reviewed by: rsmith, aaron.ballman
Differential Revision: https://reviews.llvm.org/D45463
llvm-svn: 332281
2018-05-15 03:36:45 +08:00
|
|
|
//
|
2018-05-15 05:06:04 +08:00
|
|
|
// RUN: %clang -target x86_64-linux -Xclang -verify -S -emit-llvm -o - %t.cpp \
|
[AST] Print correct tag decl for tag specifier
For example, given:
void fn() {
struct T *p0;
struct T { int i; } *p1;
}
-ast-print produced:
void fn() {
struct T { int i; } *p0;
struct T { int i; } *p1;
}
Compiling that fails with a redefinition error.
Given:
void fn() {
struct T *p0;
struct __attribute__((deprecated)) T *p1;
}
-ast-print dropped the attribute.
Details:
For a tag specifier (that is, struct/union/class/enum used as a type
specifier in a declaration) that was also a tag declaration (that is,
first occurrence of the tag) or tag redeclaration (that is, later
occurrence that specifies attributes or a member list), clang printed
the tag specifier as either (1) the full tag definition if one
existed, or (2) the first tag declaration otherwise. Redefinition
errors were sometimes introduced, as in the first example above. Even
when that was impossible because no member list was ever specified,
attributes were sometimes lost, thus changing semantics and
diagnostics, as in the second example above.
This patch fixes a major culprit for these problems. It does so by
creating an ElaboratedType with a new OwnedDecl member wherever an
occurrence of a tag type is a (re)declaration of that tag type.
PrintingPolicy's IncludeTagDefinition used to trigger printing of the
member list, attributes, etc. for a tag specifier by using a tag
(re)declaration selected as described above. Now, it triggers the
same thing except it uses the tag (re)declaration stored in the
OwnedDecl. Of course, other tooling can now make use of the new
OwnedDecl as well.
Also, to be more faithful to the original source, this patch
suppresses printing of attributes inherited from previous
declarations.
Reviewed by: rsmith, aaron.ballman
Differential Revision: https://reviews.llvm.org/D45463
llvm-svn: 332281
2018-05-15 03:36:45 +08:00
|
|
|
// RUN: | FileCheck --check-prefixes=CHECK,LLVM %s
|
|
|
|
//
|
2018-05-16 06:16:47 +08:00
|
|
|
// RUN: %clang_cc1 -verify -ast-print %t.cpp \
|
|
|
|
// RUN: | FileCheck --check-prefixes=CHECK,PRINT,PRINT-CXX -DKW=struct \
|
|
|
|
// RUN: -DBASES=' : B' %s
|
|
|
|
//
|
|
|
|
// Make sure implicit attributes aren't printed. See comments in inMemberPtr
|
|
|
|
// for details.
|
|
|
|
//
|
|
|
|
// RUN: %clang_cc1 -triple i686-pc-win32 -verify -ast-print -DKW=struct \
|
|
|
|
// RUN: -DBASES=' : B' -xc++ %s > %t.cpp
|
|
|
|
// RUN: FileCheck --check-prefixes=CHECK,PRINT,PRINT-CXX -DKW=struct \
|
|
|
|
// RUN: -DBASES=' : B' %s --input-file %t.cpp
|
|
|
|
//
|
|
|
|
// RUN: cat %t.diags >> %t.cpp
|
|
|
|
// RUN: %clang_cc1 -triple i686-pc-win32 -verify -ast-print %t.cpp \
|
2018-05-15 08:44:14 +08:00
|
|
|
// RUN: | FileCheck --check-prefixes=CHECK,PRINT,PRINT-CXX -DKW=struct \
|
[AST] Print correct tag decl for tag specifier
For example, given:
void fn() {
struct T *p0;
struct T { int i; } *p1;
}
-ast-print produced:
void fn() {
struct T { int i; } *p0;
struct T { int i; } *p1;
}
Compiling that fails with a redefinition error.
Given:
void fn() {
struct T *p0;
struct __attribute__((deprecated)) T *p1;
}
-ast-print dropped the attribute.
Details:
For a tag specifier (that is, struct/union/class/enum used as a type
specifier in a declaration) that was also a tag declaration (that is,
first occurrence of the tag) or tag redeclaration (that is, later
occurrence that specifies attributes or a member list), clang printed
the tag specifier as either (1) the full tag definition if one
existed, or (2) the first tag declaration otherwise. Redefinition
errors were sometimes introduced, as in the first example above. Even
when that was impossible because no member list was ever specified,
attributes were sometimes lost, thus changing semantics and
diagnostics, as in the second example above.
This patch fixes a major culprit for these problems. It does so by
creating an ElaboratedType with a new OwnedDecl member wherever an
occurrence of a tag type is a (re)declaration of that tag type.
PrintingPolicy's IncludeTagDefinition used to trigger printing of the
member list, attributes, etc. for a tag specifier by using a tag
(re)declaration selected as described above. Now, it triggers the
same thing except it uses the tag (re)declaration stored in the
OwnedDecl. Of course, other tooling can now make use of the new
OwnedDecl as well.
Also, to be more faithful to the original source, this patch
suppresses printing of attributes inherited from previous
declarations.
Reviewed by: rsmith, aaron.ballman
Differential Revision: https://reviews.llvm.org/D45463
llvm-svn: 332281
2018-05-15 03:36:45 +08:00
|
|
|
// RUN: -DBASES=' : B' %s
|
|
|
|
|
|
|
|
// END.
|
|
|
|
|
|
|
|
#ifndef KW
|
|
|
|
# error KW undefined
|
|
|
|
# define KW struct // help syntax checkers
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef BASES
|
|
|
|
# error BASES undefined
|
|
|
|
# define BASES // help syntax checkers
|
|
|
|
#endif
|
|
|
|
|
|
|
|
struct B {};
|
|
|
|
|
|
|
|
// CHECK-LABEL: defFirst
|
|
|
|
void defFirst() {
|
|
|
|
// PRINT-NEXT: [[KW]]
|
|
|
|
// PRINT-DAG: __attribute__((aligned(16)))
|
|
|
|
// PRINT-DAG: __attribute__((deprecated("")))
|
|
|
|
// PRINT-NOT: __attribute__
|
|
|
|
// PRINT-SAME: T[[BASES]] {
|
|
|
|
// PRINT-NEXT: int i;
|
|
|
|
// PRINT-NEXT: } *p0;
|
|
|
|
// expected-warning@+2 {{'T' is deprecated}}
|
|
|
|
// expected-note@+1 2 {{'T' has been explicitly marked deprecated here}}
|
|
|
|
KW __attribute__((aligned(16))) __attribute__((deprecated(""))) T BASES {
|
|
|
|
int i;
|
|
|
|
} *p0;
|
|
|
|
|
|
|
|
// PRINT-NEXT: [[KW]] T *p1;
|
|
|
|
KW T *p1; // expected-warning {{'T' is deprecated}}
|
|
|
|
|
|
|
|
// LLVM: store i64 16
|
|
|
|
long s0 = sizeof *p0;
|
|
|
|
// LLVM-NEXT: store i64 16
|
|
|
|
long s1 = sizeof *p1;
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK-LABEL: defLast
|
|
|
|
void defLast() {
|
|
|
|
// PRINT-NEXT: [[KW]] __attribute__((aligned(16))) T *p0;
|
|
|
|
KW __attribute__((aligned(16))) T *p0;
|
|
|
|
|
|
|
|
// PRINT-NEXT: [[KW]] __attribute__((deprecated(""))) T[[BASES]] {
|
|
|
|
// PRINT-NEXT: int i;
|
|
|
|
// PRINT-NEXT: } *p1;
|
|
|
|
// expected-warning@+2 {{'T' is deprecated}}
|
|
|
|
// expected-note@+1 {{'T' has been explicitly marked deprecated here}}
|
|
|
|
KW __attribute__((deprecated(""))) T BASES { int i; } *p1;
|
|
|
|
|
|
|
|
// LLVM: store i64 16
|
|
|
|
long s0 = sizeof *p0;
|
|
|
|
// LLVM-NEXT: store i64 16
|
|
|
|
long s1 = sizeof *p1;
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK-LABEL: defMiddle
|
|
|
|
void defMiddle() {
|
|
|
|
// PRINT-NEXT: [[KW]] __attribute__((deprecated(""))) T *p0;
|
|
|
|
// expected-warning@+2 {{'T' is deprecated}}
|
|
|
|
// expected-note@+1 3 {{'T' has been explicitly marked deprecated here}}
|
|
|
|
KW __attribute__((deprecated(""))) T *p0;
|
|
|
|
|
|
|
|
// PRINT-NEXT: [[KW]] __attribute__((aligned(16))) T[[BASES]] {
|
|
|
|
// PRINT-NEXT: int i;
|
|
|
|
// PRINT-NEXT: } *p1;
|
|
|
|
KW __attribute__((aligned(16))) T BASES { int i; } *p1; // expected-warning {{'T' is deprecated}}
|
|
|
|
|
|
|
|
// PRINT-NEXT: [[KW]] T *p2;
|
|
|
|
KW T *p2; // expected-warning {{'T' is deprecated}}
|
|
|
|
|
|
|
|
// LLVM: store i64 16
|
|
|
|
long s0 = sizeof *p0;
|
|
|
|
// LLVM-NEXT: store i64 16
|
|
|
|
long s1 = sizeof *p1;
|
|
|
|
// LLVM-NEXT: store i64 16
|
|
|
|
long s2 = sizeof *p2;
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK-LABEL: defSelfRef
|
|
|
|
void defSelfRef() {
|
|
|
|
// PRINT-NEXT: [[KW]] __attribute__((deprecated(""))) T *p0;
|
|
|
|
// expected-warning@+2 {{'T' is deprecated}}
|
|
|
|
// expected-note@+1 2 {{'T' has been explicitly marked deprecated here}}
|
|
|
|
KW __attribute__((deprecated(""))) T *p0;
|
|
|
|
|
2018-05-15 08:44:14 +08:00
|
|
|
// PRINT-NEXT: [[KW]] __attribute__((aligned(64))) T[[BASES]] {
|
|
|
|
// PRINT-NEXT: int i;
|
|
|
|
// PRINT-NEXT: [[KW]] T *p2;
|
|
|
|
// PRINT-NEXT: [[KW]] __attribute__((may_alias)) T *p3;
|
|
|
|
// PRINT-NEXT: [[KW]] T *p4;
|
|
|
|
// PRINT-NEXT: } *p1;
|
|
|
|
KW __attribute__((aligned(64))) T BASES { // expected-warning {{'T' is deprecated}}
|
[AST] Print correct tag decl for tag specifier
For example, given:
void fn() {
struct T *p0;
struct T { int i; } *p1;
}
-ast-print produced:
void fn() {
struct T { int i; } *p0;
struct T { int i; } *p1;
}
Compiling that fails with a redefinition error.
Given:
void fn() {
struct T *p0;
struct __attribute__((deprecated)) T *p1;
}
-ast-print dropped the attribute.
Details:
For a tag specifier (that is, struct/union/class/enum used as a type
specifier in a declaration) that was also a tag declaration (that is,
first occurrence of the tag) or tag redeclaration (that is, later
occurrence that specifies attributes or a member list), clang printed
the tag specifier as either (1) the full tag definition if one
existed, or (2) the first tag declaration otherwise. Redefinition
errors were sometimes introduced, as in the first example above. Even
when that was impossible because no member list was ever specified,
attributes were sometimes lost, thus changing semantics and
diagnostics, as in the second example above.
This patch fixes a major culprit for these problems. It does so by
creating an ElaboratedType with a new OwnedDecl member wherever an
occurrence of a tag type is a (re)declaration of that tag type.
PrintingPolicy's IncludeTagDefinition used to trigger printing of the
member list, attributes, etc. for a tag specifier by using a tag
(re)declaration selected as described above. Now, it triggers the
same thing except it uses the tag (re)declaration stored in the
OwnedDecl. Of course, other tooling can now make use of the new
OwnedDecl as well.
Also, to be more faithful to the original source, this patch
suppresses printing of attributes inherited from previous
declarations.
Reviewed by: rsmith, aaron.ballman
Differential Revision: https://reviews.llvm.org/D45463
llvm-svn: 332281
2018-05-15 03:36:45 +08:00
|
|
|
int i;
|
|
|
|
KW T *p2;
|
2018-05-15 08:44:14 +08:00
|
|
|
// FIXME: For C++, T at p3 loses aligned and deprecated, perhaps because
|
|
|
|
// that RecordDecl isn't in the same redecl list. Perhaps the redecl lists
|
|
|
|
// are split here but not in C due to the different scoping rules in C++
|
|
|
|
// classes.
|
|
|
|
KW __attribute__((may_alias)) T *p3;
|
|
|
|
KW T *p4;
|
[AST] Print correct tag decl for tag specifier
For example, given:
void fn() {
struct T *p0;
struct T { int i; } *p1;
}
-ast-print produced:
void fn() {
struct T { int i; } *p0;
struct T { int i; } *p1;
}
Compiling that fails with a redefinition error.
Given:
void fn() {
struct T *p0;
struct __attribute__((deprecated)) T *p1;
}
-ast-print dropped the attribute.
Details:
For a tag specifier (that is, struct/union/class/enum used as a type
specifier in a declaration) that was also a tag declaration (that is,
first occurrence of the tag) or tag redeclaration (that is, later
occurrence that specifies attributes or a member list), clang printed
the tag specifier as either (1) the full tag definition if one
existed, or (2) the first tag declaration otherwise. Redefinition
errors were sometimes introduced, as in the first example above. Even
when that was impossible because no member list was ever specified,
attributes were sometimes lost, thus changing semantics and
diagnostics, as in the second example above.
This patch fixes a major culprit for these problems. It does so by
creating an ElaboratedType with a new OwnedDecl member wherever an
occurrence of a tag type is a (re)declaration of that tag type.
PrintingPolicy's IncludeTagDefinition used to trigger printing of the
member list, attributes, etc. for a tag specifier by using a tag
(re)declaration selected as described above. Now, it triggers the
same thing except it uses the tag (re)declaration stored in the
OwnedDecl. Of course, other tooling can now make use of the new
OwnedDecl as well.
Also, to be more faithful to the original source, this patch
suppresses printing of attributes inherited from previous
declarations.
Reviewed by: rsmith, aaron.ballman
Differential Revision: https://reviews.llvm.org/D45463
llvm-svn: 332281
2018-05-15 03:36:45 +08:00
|
|
|
} *p1;
|
|
|
|
|
2018-05-15 08:44:14 +08:00
|
|
|
// LLVM: store i64 64
|
[AST] Print correct tag decl for tag specifier
For example, given:
void fn() {
struct T *p0;
struct T { int i; } *p1;
}
-ast-print produced:
void fn() {
struct T { int i; } *p0;
struct T { int i; } *p1;
}
Compiling that fails with a redefinition error.
Given:
void fn() {
struct T *p0;
struct __attribute__((deprecated)) T *p1;
}
-ast-print dropped the attribute.
Details:
For a tag specifier (that is, struct/union/class/enum used as a type
specifier in a declaration) that was also a tag declaration (that is,
first occurrence of the tag) or tag redeclaration (that is, later
occurrence that specifies attributes or a member list), clang printed
the tag specifier as either (1) the full tag definition if one
existed, or (2) the first tag declaration otherwise. Redefinition
errors were sometimes introduced, as in the first example above. Even
when that was impossible because no member list was ever specified,
attributes were sometimes lost, thus changing semantics and
diagnostics, as in the second example above.
This patch fixes a major culprit for these problems. It does so by
creating an ElaboratedType with a new OwnedDecl member wherever an
occurrence of a tag type is a (re)declaration of that tag type.
PrintingPolicy's IncludeTagDefinition used to trigger printing of the
member list, attributes, etc. for a tag specifier by using a tag
(re)declaration selected as described above. Now, it triggers the
same thing except it uses the tag (re)declaration stored in the
OwnedDecl. Of course, other tooling can now make use of the new
OwnedDecl as well.
Also, to be more faithful to the original source, this patch
suppresses printing of attributes inherited from previous
declarations.
Reviewed by: rsmith, aaron.ballman
Differential Revision: https://reviews.llvm.org/D45463
llvm-svn: 332281
2018-05-15 03:36:45 +08:00
|
|
|
long s0 = sizeof *p0;
|
2018-05-15 08:44:14 +08:00
|
|
|
// LLVM-NEXT: store i64 64
|
[AST] Print correct tag decl for tag specifier
For example, given:
void fn() {
struct T *p0;
struct T { int i; } *p1;
}
-ast-print produced:
void fn() {
struct T { int i; } *p0;
struct T { int i; } *p1;
}
Compiling that fails with a redefinition error.
Given:
void fn() {
struct T *p0;
struct __attribute__((deprecated)) T *p1;
}
-ast-print dropped the attribute.
Details:
For a tag specifier (that is, struct/union/class/enum used as a type
specifier in a declaration) that was also a tag declaration (that is,
first occurrence of the tag) or tag redeclaration (that is, later
occurrence that specifies attributes or a member list), clang printed
the tag specifier as either (1) the full tag definition if one
existed, or (2) the first tag declaration otherwise. Redefinition
errors were sometimes introduced, as in the first example above. Even
when that was impossible because no member list was ever specified,
attributes were sometimes lost, thus changing semantics and
diagnostics, as in the second example above.
This patch fixes a major culprit for these problems. It does so by
creating an ElaboratedType with a new OwnedDecl member wherever an
occurrence of a tag type is a (re)declaration of that tag type.
PrintingPolicy's IncludeTagDefinition used to trigger printing of the
member list, attributes, etc. for a tag specifier by using a tag
(re)declaration selected as described above. Now, it triggers the
same thing except it uses the tag (re)declaration stored in the
OwnedDecl. Of course, other tooling can now make use of the new
OwnedDecl as well.
Also, to be more faithful to the original source, this patch
suppresses printing of attributes inherited from previous
declarations.
Reviewed by: rsmith, aaron.ballman
Differential Revision: https://reviews.llvm.org/D45463
llvm-svn: 332281
2018-05-15 03:36:45 +08:00
|
|
|
long s1 = sizeof *p1;
|
2018-05-15 08:44:14 +08:00
|
|
|
// LLVM-NEXT: store i64 64
|
[AST] Print correct tag decl for tag specifier
For example, given:
void fn() {
struct T *p0;
struct T { int i; } *p1;
}
-ast-print produced:
void fn() {
struct T { int i; } *p0;
struct T { int i; } *p1;
}
Compiling that fails with a redefinition error.
Given:
void fn() {
struct T *p0;
struct __attribute__((deprecated)) T *p1;
}
-ast-print dropped the attribute.
Details:
For a tag specifier (that is, struct/union/class/enum used as a type
specifier in a declaration) that was also a tag declaration (that is,
first occurrence of the tag) or tag redeclaration (that is, later
occurrence that specifies attributes or a member list), clang printed
the tag specifier as either (1) the full tag definition if one
existed, or (2) the first tag declaration otherwise. Redefinition
errors were sometimes introduced, as in the first example above. Even
when that was impossible because no member list was ever specified,
attributes were sometimes lost, thus changing semantics and
diagnostics, as in the second example above.
This patch fixes a major culprit for these problems. It does so by
creating an ElaboratedType with a new OwnedDecl member wherever an
occurrence of a tag type is a (re)declaration of that tag type.
PrintingPolicy's IncludeTagDefinition used to trigger printing of the
member list, attributes, etc. for a tag specifier by using a tag
(re)declaration selected as described above. Now, it triggers the
same thing except it uses the tag (re)declaration stored in the
OwnedDecl. Of course, other tooling can now make use of the new
OwnedDecl as well.
Also, to be more faithful to the original source, this patch
suppresses printing of attributes inherited from previous
declarations.
Reviewed by: rsmith, aaron.ballman
Differential Revision: https://reviews.llvm.org/D45463
llvm-svn: 332281
2018-05-15 03:36:45 +08:00
|
|
|
long s2 = sizeof *p0->p2;
|
2018-05-15 08:44:14 +08:00
|
|
|
// LLVM-NEXT: store i64 64
|
|
|
|
long s3 = sizeof *p1->p3;
|
|
|
|
// LLVM-NEXT: store i64 64
|
|
|
|
long s4 = sizeof *p1->p4->p2;
|
[AST] Print correct tag decl for tag specifier
For example, given:
void fn() {
struct T *p0;
struct T { int i; } *p1;
}
-ast-print produced:
void fn() {
struct T { int i; } *p0;
struct T { int i; } *p1;
}
Compiling that fails with a redefinition error.
Given:
void fn() {
struct T *p0;
struct __attribute__((deprecated)) T *p1;
}
-ast-print dropped the attribute.
Details:
For a tag specifier (that is, struct/union/class/enum used as a type
specifier in a declaration) that was also a tag declaration (that is,
first occurrence of the tag) or tag redeclaration (that is, later
occurrence that specifies attributes or a member list), clang printed
the tag specifier as either (1) the full tag definition if one
existed, or (2) the first tag declaration otherwise. Redefinition
errors were sometimes introduced, as in the first example above. Even
when that was impossible because no member list was ever specified,
attributes were sometimes lost, thus changing semantics and
diagnostics, as in the second example above.
This patch fixes a major culprit for these problems. It does so by
creating an ElaboratedType with a new OwnedDecl member wherever an
occurrence of a tag type is a (re)declaration of that tag type.
PrintingPolicy's IncludeTagDefinition used to trigger printing of the
member list, attributes, etc. for a tag specifier by using a tag
(re)declaration selected as described above. Now, it triggers the
same thing except it uses the tag (re)declaration stored in the
OwnedDecl. Of course, other tooling can now make use of the new
OwnedDecl as well.
Also, to be more faithful to the original source, this patch
suppresses printing of attributes inherited from previous
declarations.
Reviewed by: rsmith, aaron.ballman
Differential Revision: https://reviews.llvm.org/D45463
llvm-svn: 332281
2018-05-15 03:36:45 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK-LABEL: declsOnly
|
|
|
|
void declsOnly() {
|
|
|
|
// PRINT-NEXT: [[KW]] T *p0;
|
|
|
|
KW T *p0;
|
|
|
|
|
|
|
|
// PRINT-NEXT: [[KW]] __attribute__((may_alias)) T *p1;
|
|
|
|
KW __attribute__((may_alias)) T *p1;
|
|
|
|
|
|
|
|
// PRINT-NEXT: [[KW]] T *p2;
|
|
|
|
KW T *p2;
|
|
|
|
|
|
|
|
// PRINT-NEXT: [[KW]] __attribute__((deprecated(""))) T *p3;
|
|
|
|
// expected-warning@+2 {{'T' is deprecated}}
|
|
|
|
// expected-note@+1 2 {{'T' has been explicitly marked deprecated here}}
|
|
|
|
KW __attribute__((deprecated(""))) T *p3;
|
|
|
|
|
|
|
|
// PRINT-NEXT: [[KW]] T *p4;
|
|
|
|
KW T *p4; // expected-warning {{'T' is deprecated}}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Make sure expanded printing of tag types is turned back off in other parts
|
|
|
|
// of a tag declaration. The base class list is checked above.
|
|
|
|
|
|
|
|
// CHECK-LABEL: inMembers
|
|
|
|
void inMembers() {
|
|
|
|
// PRINT-NEXT: [[KW]] T1 {
|
|
|
|
// PRINT-NEXT: int i;
|
|
|
|
// PRINT-NEXT: };
|
|
|
|
KW T1 { int i; };
|
|
|
|
// PRINT-NEXT: [[KW]] T2 {
|
|
|
|
// PRINT-NEXT: [[KW]] T1 i;
|
|
|
|
// PRINT-NEXT: };
|
|
|
|
KW T2 { KW T1 i; };
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK-LABEL: inInit
|
|
|
|
void inInit() {
|
|
|
|
// PRINT-NEXT: [[KW]] T1 {
|
|
|
|
// PRINT-NEXT: int i;
|
|
|
|
// PRINT-NEXT: };
|
|
|
|
KW T1 { int i; };
|
|
|
|
// PRINT-NEXT: [[KW]] T2 {
|
|
|
|
// PRINT-NEXT: long i;
|
|
|
|
// PRINT-NEXT: } t2 = {sizeof([[KW]] T1)};
|
|
|
|
KW T2 { long i; } t2 = {sizeof(KW T1)};
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
2018-05-15 08:44:14 +08:00
|
|
|
// PRINT-CXX-LABEL: inMemberPtr
|
[AST] Print correct tag decl for tag specifier
For example, given:
void fn() {
struct T *p0;
struct T { int i; } *p1;
}
-ast-print produced:
void fn() {
struct T { int i; } *p0;
struct T { int i; } *p1;
}
Compiling that fails with a redefinition error.
Given:
void fn() {
struct T *p0;
struct __attribute__((deprecated)) T *p1;
}
-ast-print dropped the attribute.
Details:
For a tag specifier (that is, struct/union/class/enum used as a type
specifier in a declaration) that was also a tag declaration (that is,
first occurrence of the tag) or tag redeclaration (that is, later
occurrence that specifies attributes or a member list), clang printed
the tag specifier as either (1) the full tag definition if one
existed, or (2) the first tag declaration otherwise. Redefinition
errors were sometimes introduced, as in the first example above. Even
when that was impossible because no member list was ever specified,
attributes were sometimes lost, thus changing semantics and
diagnostics, as in the second example above.
This patch fixes a major culprit for these problems. It does so by
creating an ElaboratedType with a new OwnedDecl member wherever an
occurrence of a tag type is a (re)declaration of that tag type.
PrintingPolicy's IncludeTagDefinition used to trigger printing of the
member list, attributes, etc. for a tag specifier by using a tag
(re)declaration selected as described above. Now, it triggers the
same thing except it uses the tag (re)declaration stored in the
OwnedDecl. Of course, other tooling can now make use of the new
OwnedDecl as well.
Also, to be more faithful to the original source, this patch
suppresses printing of attributes inherited from previous
declarations.
Reviewed by: rsmith, aaron.ballman
Differential Revision: https://reviews.llvm.org/D45463
llvm-svn: 332281
2018-05-15 03:36:45 +08:00
|
|
|
void inMemberPtr() {
|
2018-05-16 06:16:47 +08:00
|
|
|
// Under windows, the implicit attribute __single_inheritance used to print
|
|
|
|
// between KW and T1 here, but that wasn't faithful to the original source.
|
|
|
|
//
|
2018-05-15 08:44:14 +08:00
|
|
|
// PRINT-CXX-NEXT: [[KW]] T1 {
|
|
|
|
// PRINT-CXX-NEXT: int i;
|
|
|
|
// PRINT-CXX-NEXT: };
|
[AST] Print correct tag decl for tag specifier
For example, given:
void fn() {
struct T *p0;
struct T { int i; } *p1;
}
-ast-print produced:
void fn() {
struct T { int i; } *p0;
struct T { int i; } *p1;
}
Compiling that fails with a redefinition error.
Given:
void fn() {
struct T *p0;
struct __attribute__((deprecated)) T *p1;
}
-ast-print dropped the attribute.
Details:
For a tag specifier (that is, struct/union/class/enum used as a type
specifier in a declaration) that was also a tag declaration (that is,
first occurrence of the tag) or tag redeclaration (that is, later
occurrence that specifies attributes or a member list), clang printed
the tag specifier as either (1) the full tag definition if one
existed, or (2) the first tag declaration otherwise. Redefinition
errors were sometimes introduced, as in the first example above. Even
when that was impossible because no member list was ever specified,
attributes were sometimes lost, thus changing semantics and
diagnostics, as in the second example above.
This patch fixes a major culprit for these problems. It does so by
creating an ElaboratedType with a new OwnedDecl member wherever an
occurrence of a tag type is a (re)declaration of that tag type.
PrintingPolicy's IncludeTagDefinition used to trigger printing of the
member list, attributes, etc. for a tag specifier by using a tag
(re)declaration selected as described above. Now, it triggers the
same thing except it uses the tag (re)declaration stored in the
OwnedDecl. Of course, other tooling can now make use of the new
OwnedDecl as well.
Also, to be more faithful to the original source, this patch
suppresses printing of attributes inherited from previous
declarations.
Reviewed by: rsmith, aaron.ballman
Differential Revision: https://reviews.llvm.org/D45463
llvm-svn: 332281
2018-05-15 03:36:45 +08:00
|
|
|
KW T1 { int i; };
|
2018-05-15 08:44:14 +08:00
|
|
|
// PRINT-CXX-NEXT: [[KW]] T2 {
|
|
|
|
// PRINT-CXX-NEXT: } T1::*p;
|
[AST] Print correct tag decl for tag specifier
For example, given:
void fn() {
struct T *p0;
struct T { int i; } *p1;
}
-ast-print produced:
void fn() {
struct T { int i; } *p0;
struct T { int i; } *p1;
}
Compiling that fails with a redefinition error.
Given:
void fn() {
struct T *p0;
struct __attribute__((deprecated)) T *p1;
}
-ast-print dropped the attribute.
Details:
For a tag specifier (that is, struct/union/class/enum used as a type
specifier in a declaration) that was also a tag declaration (that is,
first occurrence of the tag) or tag redeclaration (that is, later
occurrence that specifies attributes or a member list), clang printed
the tag specifier as either (1) the full tag definition if one
existed, or (2) the first tag declaration otherwise. Redefinition
errors were sometimes introduced, as in the first example above. Even
when that was impossible because no member list was ever specified,
attributes were sometimes lost, thus changing semantics and
diagnostics, as in the second example above.
This patch fixes a major culprit for these problems. It does so by
creating an ElaboratedType with a new OwnedDecl member wherever an
occurrence of a tag type is a (re)declaration of that tag type.
PrintingPolicy's IncludeTagDefinition used to trigger printing of the
member list, attributes, etc. for a tag specifier by using a tag
(re)declaration selected as described above. Now, it triggers the
same thing except it uses the tag (re)declaration stored in the
OwnedDecl. Of course, other tooling can now make use of the new
OwnedDecl as well.
Also, to be more faithful to the original source, this patch
suppresses printing of attributes inherited from previous
declarations.
Reviewed by: rsmith, aaron.ballman
Differential Revision: https://reviews.llvm.org/D45463
llvm-svn: 332281
2018-05-15 03:36:45 +08:00
|
|
|
KW T2 {} T1::*p;
|
|
|
|
}
|
|
|
|
#endif
|
2018-05-15 08:44:14 +08:00
|
|
|
|
|
|
|
// Check that tag decl groups stay together in decl contexts.
|
|
|
|
|
|
|
|
// PRINT-LABEL: DeclGroupAtFileScope {
|
|
|
|
// PRINT-NEXT: int i;
|
|
|
|
// PRINT-NEXT: } *DeclGroupAtFileScopePtr;
|
|
|
|
KW DeclGroupAtFileScope { int i; } *DeclGroupAtFileScopePtr;
|
|
|
|
|
|
|
|
// PRINT-LABEL: DeclGroupInMemberList {
|
|
|
|
KW DeclGroupInMemberList {
|
|
|
|
// PRINT-NEXT: struct T1 {
|
|
|
|
// PRINT-NEXT: int i;
|
|
|
|
// PRINT-NEXT: } t1;
|
|
|
|
struct T1 { int i; } t1;
|
|
|
|
// PRINT-NEXT: union T2 {
|
|
|
|
// PRINT-NEXT: int i;
|
|
|
|
// PRINT-NEXT: } *t20, t21[2];
|
|
|
|
union T2 { int i; } *t20, t21[2];
|
|
|
|
// PRINT-NEXT: enum T3 {
|
|
|
|
// PRINT-NEXT: T30
|
|
|
|
// PRINT-NEXT: } t30;
|
|
|
|
enum T3 { T30 } t30;
|
|
|
|
// PRINT-NEXT: };
|
|
|
|
};
|
|
|
|
|
|
|
|
// A tag decl group in the tag decl's own member list is exercised in
|
|
|
|
// defSelfRef above.
|