summaryrefslogtreecommitdiffstats
path: root/clang/test/SemaCXX/aggregate-initialization.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2016-03-08 23:17:35 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2016-03-08 23:17:35 +0000
commitbbbe6184678e6c0c159cfff1f24c95508a7708fa (patch)
treef8cc6e8adb2464cb1db150c441895c209c5290de /clang/test/SemaCXX/aggregate-initialization.cpp
parent6365e46459a0c181a7416a2d00c5a644bf2d2440 (diff)
downloadbcm5719-llvm-bbbe6184678e6c0c159cfff1f24c95508a7708fa.tar.gz
bcm5719-llvm-bbbe6184678e6c0c159cfff1f24c95508a7708fa.zip
Fix crash in access check for aggregate initialization of base classes. It's
not obvious how to access-check these, so pick a conservative rule until we get feedback from CWG. llvm-svn: 262966
Diffstat (limited to 'clang/test/SemaCXX/aggregate-initialization.cpp')
-rw-r--r--clang/test/SemaCXX/aggregate-initialization.cpp68
1 files changed, 66 insertions, 2 deletions
diff --git a/clang/test/SemaCXX/aggregate-initialization.cpp b/clang/test/SemaCXX/aggregate-initialization.cpp
index 4e4177463f8..ddaf33fc1bf 100644
--- a/clang/test/SemaCXX/aggregate-initialization.cpp
+++ b/clang/test/SemaCXX/aggregate-initialization.cpp
@@ -1,4 +1,6 @@
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++14 %s
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++1z %s
// Verify that using an initializer list for a non-aggregate looks for
// constructors..
@@ -11,7 +13,7 @@ struct NonAggr1 { // expected-note 2 {{candidate constructor}}
};
struct Base { };
-struct NonAggr2 : public Base { // expected-note 3 {{candidate constructor}}
+struct NonAggr2 : public Base { // expected-note 0-3 {{candidate constructor}}
int m;
};
@@ -25,9 +27,15 @@ struct NonAggr4 { // expected-note 3 {{candidate constructor}}
};
NonAggr1 na1 = { 17 }; // expected-error{{no matching constructor for initialization of 'NonAggr1'}}
-NonAggr2 na2 = { 17 }; // expected-error{{no matching constructor for initialization of 'NonAggr2'}}
+NonAggr2 na2 = { 17 };
NonAggr3 na3 = { 17 }; // expected-error{{no matching constructor for initialization of 'NonAggr3'}}
NonAggr4 na4 = { 17 }; // expected-error{{no matching constructor for initialization of 'NonAggr4'}}
+#if __cplusplus <= 201402L
+// expected-error@-4{{no matching constructor for initialization of 'NonAggr2'}}
+#else
+// expected-error@-6{{requires explicit braces}}
+NonAggr2 na2b = { {}, 17 }; // ok
+#endif
// PR5817
typedef int type[][2];
@@ -82,3 +90,59 @@ public:
};
AggAgg aggagg = { 1, 2, 3, 4 };
+
+namespace diff_cpp14_dcl_init_aggr_example {
+ struct derived;
+ struct base {
+ friend struct derived;
+ private:
+ base();
+ };
+ struct derived : base {};
+
+ derived d1{};
+#if __cplusplus > 201402L
+ // expected-error@-2 {{private}}
+ // expected-note@-7 {{here}}
+#endif
+ derived d2;
+}
+
+namespace ProtectedBaseCtor {
+ // FIXME: It's unclear whether f() and g() should be valid in C++1z. What is
+ // the object expression in a constructor call -- the base class subobject or
+ // the complete object?
+ struct A {
+ protected:
+ A();
+ };
+
+ struct B : public A {
+ friend B f();
+ friend B g();
+ friend B h();
+ };
+
+ B f() { return {}; }
+#if __cplusplus > 201402L
+ // expected-error@-2 {{protected default constructor}}
+ // expected-note@-12 {{here}}
+#endif
+
+ B g() { return {{}}; }
+#if __cplusplus <= 201402L
+ // expected-error@-2 {{no matching constructor}}
+ // expected-note@-15 3{{candidate}}
+#else
+ // expected-error@-5 {{protected default constructor}}
+ // expected-note@-21 {{here}}
+#endif
+
+ B h() { return {A{}}; }
+#if __cplusplus <= 201402L
+ // expected-error@-2 {{no matching constructor}}
+ // expected-note@-24 3{{candidate}}
+#endif
+ // expected-error@-5 {{protected constructor}}
+ // expected-note@-30 {{here}}
+}
OpenPOWER on IntegriCloud