2014-12-17 09:08:39 +08:00
|
|
|
// RUN: %clang_cc1 -std=c++98 -triple x86_64-unknown-unknown %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
|
|
|
|
// RUN: %clang_cc1 -std=c++11 -triple x86_64-unknown-unknown %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
|
|
|
|
// RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
|
|
|
|
// RUN: %clang_cc1 -std=c++1z -triple x86_64-unknown-unknown %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
|
|
|
|
|
|
|
|
namespace dr1684 { // dr1684: 3.6
|
|
|
|
#if __cplusplus >= 201103L
|
|
|
|
struct NonLiteral { // expected-note {{because}}
|
|
|
|
NonLiteral();
|
|
|
|
constexpr int f() { return 0; } // expected-warning 0-1{{will not be implicitly 'const'}}
|
|
|
|
};
|
|
|
|
constexpr int f(NonLiteral &) { return 0; }
|
|
|
|
constexpr int f(NonLiteral) { return 0; } // expected-error {{not a literal type}}
|
|
|
|
#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 dr1631 { // dr1631: 3.7
|
2015-01-28 09:01:21 +08:00
|
|
|
#if __cplusplus >= 201103L
|
|
|
|
// Incorrect overload resolution for single-element initializer-list
|
|
|
|
|
|
|
|
struct A { int a[1]; };
|
|
|
|
struct B { B(int); };
|
|
|
|
void f(B, int);
|
|
|
|
void f(B, int, int = 0);
|
|
|
|
void f(int, A);
|
|
|
|
|
|
|
|
void test() {
|
2015-02-12 09:50:05 +08:00
|
|
|
f({0}, {{1}}); // expected-warning {{braces around scalar init}}
|
2015-01-28 09:01:21 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
namespace with_error {
|
|
|
|
void f(B, int); // TODO: expected- note {{candidate function}}
|
|
|
|
void f(int, A); // expected-note {{candidate function}}
|
|
|
|
void f(int, A, int = 0); // expected-note {{candidate function}}
|
|
|
|
|
|
|
|
void test() {
|
|
|
|
f({0}, {{1}}); // expected-error{{call to 'f' is ambiguous}}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#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
|
|
|
}
|
|
|
|
|
2016-12-10 03:11:50 +08:00
|
|
|
namespace dr1638 { // dr1638: yes
|
|
|
|
#if __cplusplus >= 201103L
|
|
|
|
template<typename T> struct A {
|
|
|
|
enum class E; // expected-note {{previous}}
|
|
|
|
enum class F : T; // expected-note 2{{previous}}
|
|
|
|
};
|
|
|
|
|
|
|
|
template<> enum class A<int>::E;
|
|
|
|
template<> enum class A<int>::E {};
|
|
|
|
template<> enum class A<int>::F : int;
|
|
|
|
template<> enum class A<int>::F : int {};
|
|
|
|
|
|
|
|
template<> enum class A<short>::E : int;
|
|
|
|
template<> enum class A<short>::E : int {};
|
|
|
|
|
|
|
|
template<> enum class A<short>::F; // expected-error {{different underlying type}}
|
|
|
|
template<> enum class A<char>::E : char; // expected-error {{different underlying type}}
|
|
|
|
template<> enum class A<char>::F : int; // expected-error {{different underlying type}}
|
|
|
|
|
|
|
|
enum class A<unsigned>::E; // expected-error {{template specialization requires 'template<>'}} expected-error {{nested name specifier}}
|
|
|
|
template enum class A<unsigned>::E; // expected-error {{enumerations cannot be explicitly instantiated}}
|
|
|
|
enum class A<unsigned>::E *e; // expected-error {{must use 'enum' not 'enum class'}}
|
|
|
|
|
|
|
|
struct B {
|
|
|
|
friend enum class A<unsigned>::E; // expected-error {{must use 'enum' not 'enum class'}}
|
|
|
|
};
|
|
|
|
#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 dr1645 { // dr1645: 3.9
|
|
|
|
#if __cplusplus >= 201103L
|
2017-01-14 04:46:54 +08:00
|
|
|
struct A {
|
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
|
|
|
constexpr A(int, float = 0); // expected-note 2{{candidate}}
|
|
|
|
explicit A(int, int = 0); // expected-note 2{{candidate}}
|
|
|
|
A(int, int, int = 0) = delete; // expected-note {{candidate}}
|
|
|
|
};
|
|
|
|
|
|
|
|
struct B : A { // expected-note 2{{candidate}}
|
2017-01-14 04:46:54 +08:00
|
|
|
using A::A; // expected-note 5{{inherited here}}
|
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
|
|
|
};
|
|
|
|
|
|
|
|
constexpr B a(0); // expected-error {{ambiguous}}
|
|
|
|
constexpr B b(0, 0); // expected-error {{ambiguous}}
|
|
|
|
#endif
|
|
|
|
}
|
2016-12-10 03:11:50 +08:00
|
|
|
|
2017-01-13 08:57:54 +08:00
|
|
|
namespace dr1653 { // dr1653: 4 c++17
|
2016-12-10 03:11:50 +08:00
|
|
|
void f(bool b) {
|
|
|
|
++b;
|
|
|
|
b++;
|
|
|
|
#if __cplusplus <= 201402L
|
|
|
|
// expected-warning@-3 {{deprecated}} expected-warning@-2 {{deprecated}}
|
|
|
|
#else
|
|
|
|
// expected-error@-5 {{incrementing expression of type bool}} expected-error@-4 {{incrementing expression of type bool}}
|
|
|
|
#endif
|
|
|
|
--b; // expected-error {{cannot decrement expression of type bool}}
|
|
|
|
b--; // expected-error {{cannot decrement expression of type bool}}
|
|
|
|
b += 1; // ok
|
|
|
|
b -= 1; // ok
|
|
|
|
}
|
|
|
|
}
|