2015-01-28 09:01:21 +08:00
// RUN: %clang_cc1 -std=c++98 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
// RUN: %clang_cc1 -std=c++11 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
// RUN: %clang_cc1 -std=c++14 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
// RUN: %clang_cc1 -std=c++1z %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
P0136R1, DR1573, DR1645, DR1715, DR1736, DR1903, DR1941, DR1959, DR1991:
Replace inheriting constructors implementation with new approach, voted into
C++ last year as a DR against C++11.
Instead of synthesizing a set of derived class constructors for each inherited
base class constructor, we make the constructors of the base class visible to
constructor lookup in the derived class, using the normal rules for
using-declarations.
For constructors, UsingShadowDecl now has a ConstructorUsingShadowDecl derived
class that tracks the requisite additional information. We create shadow
constructors (not found by name lookup) in the derived class to model the
actual initialization, and have a new expression node,
CXXInheritedCtorInitExpr, to model the initialization of a base class from such
a constructor. (This initialization is special because it performs real perfect
forwarding of arguments.)
In cases where argument forwarding is not possible (for inalloca calls,
variadic calls, and calls with callee parameter cleanup), the shadow inheriting
constructor is not emitted and instead we directly emit the initialization code
into the caller of the inherited constructor.
Note that this new model is not perfectly compatible with the old model in some
corner cases. In particular:
* if B inherits a private constructor from A, and C uses that constructor to
construct a B, then we previously required that A befriends B and B
befriends C, but the new rules require A to befriend C directly, and
* if a derived class has its own constructors (and so its implicit default
constructor is suppressed), it may still inherit a default constructor from
a base class
llvm-svn: 274049
2016-06-29 03:03:57 +08:00
namespace dr1715 { // dr1715: 3.9
# if __cplusplus >= 201103L
struct B {
template < class T > B ( T , typename T : : Q ) ;
} ;
class S {
using Q = int ;
template < class T > friend B : : B ( T , typename T : : Q ) ;
} ;
struct D : B {
using B : : B ;
} ;
struct E : B { // expected-note 2{{candidate}}
template < class T > E ( T t , typename T : : Q q ) : B ( t , q ) { } // expected-note {{'Q' is a private member}}
} ;
B b ( S ( ) , 1 ) ;
D d ( S ( ) , 2 ) ;
E e ( S ( ) , 3 ) ; // expected-error {{no match}}
# endif
}
namespace dr1736 { // dr1736: 3.9
# if __cplusplus >= 201103L
struct S {
template < class T > S ( T t ) {
struct L : S {
using S : : S ;
} ;
typename T : : type value ; // expected-error {{no member}}
L l ( value ) ; // expected-note {{instantiation of}}
}
} ;
struct Q { typedef int type ; } q ;
S s ( q ) ; // expected-note {{instantiation of}}
# endif
}
2020-01-25 07:14:25 +08:00
namespace dr1753 { // dr1753: 11
typedef int T ;
struct A { typedef int T ; } ;
namespace B { typedef int T ; }
void f ( T n ) {
n . ~ T ( ) ;
n . T : : ~ T ( ) ;
n . dr1753 : : ~ T ( ) ; // expected-error {{'dr1753' does not refer to a type name in pseudo-destructor}}
n . dr1753 : : T : : ~ T ( ) ;
n . A : : ~ T ( ) ; // expected-error {{the type of object expression ('dr1753::T' (aka 'int')) does not match the type being destroyed ('dr1753::A') in pseudo-destructor expression}}
n . A : : T : : ~ T ( ) ;
n . B : : ~ T ( ) ; // expected-error {{'B' does not refer to a type name in pseudo-destructor expression}}
n . B : : T : : ~ T ( ) ;
# if __cplusplus >= 201103L
n . decltype ( n ) : : ~ T ( ) ; // expected-error {{not a class, namespace, or enumeration}}
n . T : : ~ decltype ( n ) ( ) ; // expected-error {{expected a class name after '~'}}
n . ~ decltype ( n ) ( ) ; // OK
# endif
}
}
P0136R1, DR1573, DR1645, DR1715, DR1736, DR1903, DR1941, DR1959, DR1991:
Replace inheriting constructors implementation with new approach, voted into
C++ last year as a DR against C++11.
Instead of synthesizing a set of derived class constructors for each inherited
base class constructor, we make the constructors of the base class visible to
constructor lookup in the derived class, using the normal rules for
using-declarations.
For constructors, UsingShadowDecl now has a ConstructorUsingShadowDecl derived
class that tracks the requisite additional information. We create shadow
constructors (not found by name lookup) in the derived class to model the
actual initialization, and have a new expression node,
CXXInheritedCtorInitExpr, to model the initialization of a base class from such
a constructor. (This initialization is special because it performs real perfect
forwarding of arguments.)
In cases where argument forwarding is not possible (for inalloca calls,
variadic calls, and calls with callee parameter cleanup), the shadow inheriting
constructor is not emitted and instead we directly emit the initialization code
into the caller of the inherited constructor.
Note that this new model is not perfectly compatible with the old model in some
corner cases. In particular:
* if B inherits a private constructor from A, and C uses that constructor to
construct a B, then we previously required that A befriends B and B
befriends C, but the new rules require A to befriend C directly, and
* if a derived class has its own constructors (and so its implicit default
constructor is suppressed), it may still inherit a default constructor from
a base class
llvm-svn: 274049
2016-06-29 03:03:57 +08:00
namespace dr1756 { // dr1756: 3.7
2015-01-28 09:01:21 +08:00
# if __cplusplus >= 201103L
// Direct-list-initialization of a non-class object
int a { 0 } ;
struct X { operator int ( ) ; } x ;
int b { x } ;
P0136R1, DR1573, DR1645, DR1715, DR1736, DR1903, DR1941, DR1959, DR1991:
Replace inheriting constructors implementation with new approach, voted into
C++ last year as a DR against C++11.
Instead of synthesizing a set of derived class constructors for each inherited
base class constructor, we make the constructors of the base class visible to
constructor lookup in the derived class, using the normal rules for
using-declarations.
For constructors, UsingShadowDecl now has a ConstructorUsingShadowDecl derived
class that tracks the requisite additional information. We create shadow
constructors (not found by name lookup) in the derived class to model the
actual initialization, and have a new expression node,
CXXInheritedCtorInitExpr, to model the initialization of a base class from such
a constructor. (This initialization is special because it performs real perfect
forwarding of arguments.)
In cases where argument forwarding is not possible (for inalloca calls,
variadic calls, and calls with callee parameter cleanup), the shadow inheriting
constructor is not emitted and instead we directly emit the initialization code
into the caller of the inherited constructor.
Note that this new model is not perfectly compatible with the old model in some
corner cases. In particular:
* if B inherits a private constructor from A, and C uses that constructor to
construct a B, then we previously required that A befriends B and B
befriends C, but the new rules require A to befriend C directly, and
* if a derived class has its own constructors (and so its implicit default
constructor is suppressed), it may still inherit a default constructor from
a base class
llvm-svn: 274049
2016-06-29 03:03:57 +08:00
# endif
}
2015-01-28 09:01:21 +08:00
P0136R1, DR1573, DR1645, DR1715, DR1736, DR1903, DR1941, DR1959, DR1991:
Replace inheriting constructors implementation with new approach, voted into
C++ last year as a DR against C++11.
Instead of synthesizing a set of derived class constructors for each inherited
base class constructor, we make the constructors of the base class visible to
constructor lookup in the derived class, using the normal rules for
using-declarations.
For constructors, UsingShadowDecl now has a ConstructorUsingShadowDecl derived
class that tracks the requisite additional information. We create shadow
constructors (not found by name lookup) in the derived class to model the
actual initialization, and have a new expression node,
CXXInheritedCtorInitExpr, to model the initialization of a base class from such
a constructor. (This initialization is special because it performs real perfect
forwarding of arguments.)
In cases where argument forwarding is not possible (for inalloca calls,
variadic calls, and calls with callee parameter cleanup), the shadow inheriting
constructor is not emitted and instead we directly emit the initialization code
into the caller of the inherited constructor.
Note that this new model is not perfectly compatible with the old model in some
corner cases. In particular:
* if B inherits a private constructor from A, and C uses that constructor to
construct a B, then we previously required that A befriends B and B
befriends C, but the new rules require A to befriend C directly, and
* if a derived class has its own constructors (and so its implicit default
constructor is suppressed), it may still inherit a default constructor from
a base class
llvm-svn: 274049
2016-06-29 03:03:57 +08:00
namespace dr1758 { // dr1758: 3.7
# if __cplusplus >= 201103L
2015-01-28 09:01:21 +08:00
// Explicit conversion in copy/move list initialization
struct X { X ( ) ; } ;
struct Y { explicit operator X ( ) ; } y ;
X x { y } ;
struct A {
A ( ) { }
A ( const A & ) { }
} ;
struct B {
operator A ( ) { return A ( ) ; }
} b ;
A a { b } ;
# endif
P0136R1, DR1573, DR1645, DR1715, DR1736, DR1903, DR1941, DR1959, DR1991:
Replace inheriting constructors implementation with new approach, voted into
C++ last year as a DR against C++11.
Instead of synthesizing a set of derived class constructors for each inherited
base class constructor, we make the constructors of the base class visible to
constructor lookup in the derived class, using the normal rules for
using-declarations.
For constructors, UsingShadowDecl now has a ConstructorUsingShadowDecl derived
class that tracks the requisite additional information. We create shadow
constructors (not found by name lookup) in the derived class to model the
actual initialization, and have a new expression node,
CXXInheritedCtorInitExpr, to model the initialization of a base class from such
a constructor. (This initialization is special because it performs real perfect
forwarding of arguments.)
In cases where argument forwarding is not possible (for inalloca calls,
variadic calls, and calls with callee parameter cleanup), the shadow inheriting
constructor is not emitted and instead we directly emit the initialization code
into the caller of the inherited constructor.
Note that this new model is not perfectly compatible with the old model in some
corner cases. In particular:
* if B inherits a private constructor from A, and C uses that constructor to
construct a B, then we previously required that A befriends B and B
befriends C, but the new rules require A to befriend C directly, and
* if a derived class has its own constructors (and so its implicit default
constructor is suppressed), it may still inherit a default constructor from
a base class
llvm-svn: 274049
2016-06-29 03:03:57 +08:00
}
2019-01-22 00:25:08 +08:00
2019-04-26 09:51:08 +08:00
namespace dr1722 { // dr1722: 9
2019-01-22 00:25:08 +08:00
# if __cplusplus >= 201103L
void f ( ) {
const auto lambda = [ ] ( int x ) { return x + 1 ; } ;
// Without the DR applied, this static_assert would fail.
static_assert (
noexcept ( ( int ( * ) ( int ) ) ( lambda ) ) ,
" Lambda-to-function-pointer conversion is expected to be noexcept " ) ;
}
# endif
} // namespace dr1722
2019-05-06 13:04:56 +08:00
namespace dr1778 { // dr1778: 9
// Superseded by P1286R2.
# if __cplusplus >= 201103L
struct A { A ( ) noexcept ( true ) = default ; } ;
struct B { B ( ) noexcept ( false ) = default ; } ;
static_assert ( noexcept ( A ( ) ) , " " ) ;
static_assert ( ! noexcept ( B ( ) ) , " " ) ;
struct C { A a ; C ( ) noexcept ( false ) = default ; } ;
struct D { B b ; D ( ) noexcept ( true ) = default ; } ;
static_assert ( ! noexcept ( C ( ) ) , " " ) ;
static_assert ( noexcept ( D ( ) ) , " " ) ;
# endif
}