Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[C++20][Modules] Update handling of implicit inlines [P1779R3]
This provides updates to [class.mfct]: Pre C++20 [class.mfct]p2: A member function may be defined (8.4) in its class definition, in which case it is an inline member function (7.1.2) Post C++20 [class.mfct]p1: If a member function is attached to the global module and is defined in its class definition, it is inline. and [class.friend]: Pre-C++20 [class.friend]p5 A function can be defined in a friend declaration of a class . . . . Such a function is implicitly inline. Post C++20 [class.friend]p7 Such a function is implicitly an inline function if it is attached to the global module. We add the output of implicit-inline to the TextNodeDumper, and amend a couple of existing tests to account for this, plus add tests for the cases covered above. Differential Revision: https://reviews.llvm.org/D129045
- Loading branch information
Showing
6 changed files
with
140 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
// RUN: rm -rf %t | ||
// RUN: mkdir -p %t | ||
// RUN: split-file %s %t | ||
// RUN: cd %t | ||
// | ||
// RUN: %clang_cc1 -std=c++20 no-modules.cpp -fsyntax-only -ast-dump | \ | ||
// RUN: FileCheck --match-full-lines --check-prefix=CHECK-NM %s | ||
// RUN: %clang_cc1 -std=c++20 -xc++-user-header header-unit.h -ast-dump | \ | ||
// RUN: FileCheck --match-full-lines --check-prefix=CHECK-HU %s | ||
// RUN: %clang_cc1 -std=c++20 module.cpp -ast-dump | \ | ||
// RUN: FileCheck --match-full-lines --check-prefix=CHECK-MOD %s | ||
|
||
//--- no-modules.cpp | ||
|
||
class X { | ||
friend void x(){}; | ||
}; | ||
|
||
// CHECK-NM: `-CXXRecordDecl {{.*}} <no-modules.cpp:2:1, line:4:1> line:2:7 class X definition | ||
// CHECK-NM: |-CXXRecordDecl {{.*}} <col:1, col:7> col:7 implicit class X | ||
// CHECK-NM-NEXT: `-FriendDecl {{.*}} <line:3:3, col:19> col:15 | ||
// CHECK-NM-NEXT: `-FunctionDecl {{.*}} parent {{.*}} <col:3, col:19> col:15 x 'void ()' implicit-inline | ||
|
||
//--- header-unit.h | ||
|
||
class Y { | ||
friend void y(){}; | ||
}; | ||
|
||
// CHECK-HU: `-CXXRecordDecl {{.*}} <./header-unit.h:2:1, line:4:1> line:2:7 class Y definition | ||
// CHECK-HU: |-CXXRecordDecl {{.*}} <col:1, col:7> col:7 implicit class Y | ||
// CHECK-HU-NEXT: `-FriendDecl {{.*}} <line:3:3, col:19> col:15 | ||
// CHECK-HU-NEXT: `-FunctionDecl {{.*}} parent {{.*}} <col:3, col:19> col:15 y 'void ()' implicit-inline | ||
|
||
// A textually-included header | ||
//--- header.h | ||
|
||
class A { | ||
friend void a(){}; | ||
}; | ||
|
||
//--- module.cpp | ||
module; | ||
#include "header.h" | ||
|
||
export module M; | ||
|
||
class Z { | ||
friend void z(){}; | ||
}; | ||
// CHECK-MOD: |-CXXRecordDecl {{.*}} <./header.h:2:1, line:4:1> line:2:7 in M.<global> hidden class A definition | ||
// CHECK-MOD: | |-CXXRecordDecl {{.*}} <col:1, col:7> col:7 in M.<global> hidden implicit class A | ||
// CHECK-MOD-NEXT: | `-FriendDecl {{.*}} <line:3:3, col:19> col:15 in M.<global> | ||
// CHECK-MOD-NEXT: | `-FunctionDecl {{.*}} parent {{.*}} <col:3, col:19> col:15 in M.<global> hidden a 'void ()' implicit-inline | ||
|
||
// CHECK-MOD: `-CXXRecordDecl {{.*}} <module.cpp:6:1, line:8:1> line:6:7 in M hidden class Z{{( ReachableWhenImported)?}} definition | ||
// CHECK-MOD: |-CXXRecordDecl {{.*}} <col:1, col:7> col:7 in M hidden implicit class Z{{( ReachableWhenImported)?}} | ||
// CHECK-MOD-NEXT: `-FriendDecl {{.*}} <line:7:3, col:19> col:15 in M{{( ReachableWhenImported)?}} | ||
// CHECK-MOD-NEXT: `-FunctionDecl {{.*}} parent {{.*}} <col:3, col:19> col:15 in M hidden z 'void ()'{{( ReachableWhenImported)?}} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
// RUN: rm -rf %t | ||
// RUN: mkdir -p %t | ||
// RUN: split-file %s %t | ||
// RUN: cd %t | ||
// | ||
// RUN: %clang_cc1 -std=c++20 no-modules.cpp -fsyntax-only -ast-dump | \ | ||
// RUN: FileCheck --match-full-lines --check-prefix=CHECK-NM %s | ||
// RUN: %clang_cc1 -std=c++20 -xc++-user-header header-unit.h -ast-dump | \ | ||
// RUN: FileCheck --match-full-lines --check-prefix=CHECK-HU %s | ||
// RUN: %clang_cc1 -std=c++20 module.cpp -ast-dump | \ | ||
// RUN: FileCheck --match-full-lines --check-prefix=CHECK-MOD %s | ||
|
||
//--- no-modules.cpp | ||
|
||
class X { | ||
void x(){}; | ||
}; | ||
|
||
// CHECK-NM: `-CXXRecordDecl {{.*}} <no-modules.cpp:2:1, line:4:1> line:2:7 class X definition | ||
// CHECK-NM: |-CXXRecordDecl {{.*}} <col:1, col:7> col:7 implicit class X | ||
// CHECK-NM-NEXT: `-CXXMethodDecl {{.*}} <line:3:3, col:12> col:8 x 'void ()' implicit-inline | ||
|
||
// A header unit header | ||
//--- header-unit.h | ||
|
||
class Y { | ||
void y(){}; | ||
}; | ||
|
||
// CHECK-HU: `-CXXRecordDecl {{.*}} <./header-unit.h:2:1, line:4:1> line:2:7 class Y definition | ||
// CHECK-HU: |-CXXRecordDecl {{.*}} <col:1, col:7> col:7 implicit class Y | ||
// CHECK-HU-NEXT: `-CXXMethodDecl {{.*}} <line:3:3, col:12> col:8 y 'void ()' implicit-inline | ||
|
||
// A textually-included header | ||
//--- header.h | ||
|
||
class A { | ||
void a(){}; | ||
}; | ||
|
||
//--- module.cpp | ||
module; | ||
#include "header.h" | ||
|
||
export module M; | ||
|
||
class Z { | ||
void z(){}; | ||
}; | ||
|
||
// CHECK-MOD: |-CXXRecordDecl {{.*}} <./header.h:2:1, line:4:1> line:2:7 in M.<global> hidden class A definition | ||
// CHECK-MOD: | |-CXXRecordDecl {{.*}} <col:1, col:7> col:7 in M.<global> hidden implicit class A | ||
// CHECK-MOD-NEXT: | `-CXXMethodDecl {{.*}} <line:3:3, col:12> col:8 in M.<global> hidden a 'void ()' implicit-inline | ||
|
||
// CHECK-MOD: `-CXXRecordDecl {{.*}} <module.cpp:6:1, line:8:1> line:6:7 in M hidden class Z{{( ReachableWhenImported)?}} definition | ||
// CHECK-MOD: |-CXXRecordDecl {{.*}} <col:1, col:7> col:7 in M hidden implicit class Z{{( ReachableWhenImported)?}} | ||
// CHECK-MOD-NEXT: `-CXXMethodDecl {{.*}} <line:7:3, col:12> col:8 in M hidden z 'void ()'{{( ReachableWhenImported)?}} |