]> granicus.if.org Git - clang/commitdiff
Turn access control on by default in -cc1.
authorJohn McCall <rjmccall@apple.com>
Fri, 9 Apr 2010 19:03:51 +0000 (19:03 +0000)
committerJohn McCall <rjmccall@apple.com>
Fri, 9 Apr 2010 19:03:51 +0000 (19:03 +0000)
Remove -faccess-control from -cc1; add -fno-access-control.
Make the driver pass -fno-access-control by default.
Update a bunch of tests to be correct under access control.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@100880 91177308-0d34-0410-b5e6-96231b3b80d8

48 files changed:
lib/Driver/Tools.cpp
lib/Frontend/CompilerInvocation.cpp
test/CXX/class.access/class.access.base/p1.cpp
test/CXX/class.access/class.access.base/p5.cpp
test/CXX/class.access/class.access.nest/p1.cpp
test/CXX/class.access/class.friend/p1.cpp
test/CXX/class.access/class.protected/p1.cpp
test/CXX/class.access/p4.cpp
test/CXX/class.access/p6.cpp
test/CXX/class/class.local/p2.cpp
test/CXX/class/class.mfct/class.mfct.non-static/p3.cpp
test/CXX/conv/conv.mem/p4.cpp
test/CXX/dcl.dcl/basic.namespace/namespace.udecl/p1.cpp
test/CXX/dcl.decl/dcl.meaning/dcl.fct.default/p6.cpp
test/CXX/expr/expr.unary/expr.delete/p5.cpp
test/CXX/temp/temp.decls/temp.class.spec/temp.class.order/p2.cpp
test/CXX/temp/temp.decls/temp.friend/p1.cpp
test/CXX/temp/temp.spec/temp.inst/p11.cpp
test/CodeGenCXX/assign-operator.cpp
test/CodeGenCXX/constructor-init-reference.cpp
test/CodeGenCXX/constructors.cpp
test/CodeGenCXX/default-destructor-nested.cpp
test/CodeGenCXX/instantiate-init-list.cpp
test/CodeGenCXX/mangle.cpp
test/CodeGenCXX/new-operator-phi.cpp
test/CodeGenCXX/operator-new.cpp
test/CodeGenCXX/template-anonymous-union-member-initializer.cpp
test/CodeGenCXX/template-instantiation.cpp
test/CodeGenCXX/virt-template-vtable.cpp
test/FixIt/typo.cpp
test/SemaCXX/access-base-class.cpp
test/SemaCXX/access-control-check.cpp
test/SemaCXX/conditional-expr.cpp
test/SemaCXX/constructor-initializer.cpp
test/SemaCXX/cstyle-cast.cpp
test/SemaCXX/direct-initializer.cpp
test/SemaCXX/functional-cast.cpp
test/SemaCXX/nested-name-spec.cpp
test/SemaCXX/new-delete.cpp
test/SemaCXX/overloaded-operator.cpp
test/SemaCXX/static-cast.cpp
test/SemaCXX/virtual-override.cpp
test/SemaTemplate/dependent-names.cpp
test/SemaTemplate/instantiate-local-class.cpp
test/SemaTemplate/instantiate-member-class.cpp
test/SemaTemplate/instantiate-member-initializers.cpp
test/SemaTemplate/instantiate-using-decl.cpp
test/SemaTemplate/qualified-id.cpp

index e2ed17164263599ca22a6385cc60fd9f5452e7b7..457744f3693ddbe43d058cec8747e36b7505d824 100644 (file)
@@ -1153,10 +1153,10 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
   }
 
   // -fno-access-control is default (for now).
-  if (Args.hasFlag(options::OPT_faccess_control,
-                   options::OPT_fno_access_control,
-                   false))
-    CmdArgs.push_back("-faccess-control");
+  if (Args.hasFlag(options::OPT_fno_access_control,
+                   options::OPT_faccess_control,
+                   true))
+    CmdArgs.push_back("-fno-access-control");
 
   // -fexceptions=0 is default.
   if (needsExceptions(Args, InputType, getToolChain().getTriple()))
index 0ab70a9c16353a15c3bce9a329e588edcf2e4b95..f5f9ea4226498b5339544890c7990df502f26b81 100644 (file)
@@ -524,9 +524,8 @@ static void LangOptsToArgs(const LangOptions &Opts,
   }
   if (Opts.ObjCGCBitmapPrint)
     Res.push_back("-print-ivar-layout");
-  // FIXME: Don't forget to update when the default changes!
-  if (Opts.AccessControl)
-    Res.push_back("-faccess-control");
+  if (!Opts.AccessControl)
+    Res.push_back("-fno-access-control");
   if (!Opts.CharIsSigned)
     Res.push_back("-fno-signed-char");
   if (Opts.ShortWChar)
@@ -1188,7 +1187,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args,
   Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
   Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
   Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
-  Opts.AccessControl = Args.hasArg(OPT_faccess_control);
+  Opts.AccessControl = !Args.hasArg(OPT_fno_access_control);
   Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
   Opts.MathErrno = Args.hasArg(OPT_fmath_errno);
   Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99,
index 1bbcedb9a1e72c229df5fead857c08ad9b872982..09884316f9cd5186aba7e522600c70da75d61ce4 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -faccess-control -verify %s
+// RUN: %clang_cc1 -fsyntax-only -verify %s
 
 // C++0x [class.access.base]p1(a):
 //   If a class is declared to be a base class for another class using
index 96037e7de2b04fa162fed6ffd566997c8ad9836f..938d9fbe9bf8a91346d3a94433e29d2ad99fdccd 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -faccess-control -verify %s
+// RUN: %clang_cc1 -verify %s
 
 namespace test0 {
   struct A {
index d2644c6ef476136b3baa7746de9bc587d52b8e37..eceffcf991bb73a32bd14e7d4749bd79de940309 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -faccess-control -verify %s
+// RUN: %clang_cc1 -fsyntax-only -verify %s
 
 // Derived from GNU's std::string
 namespace test0 {
index 22266cd8f8fcdb8ff1644762638919ab92dbc873..7ea4f078d205ccd40103996310f9a91c8bf5ac56 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -faccess-control -verify %s
+// RUN: %clang_cc1 -fsyntax-only -verify %s
 
 // C++'0x [class.friend] p1:
 //   A friend of a class is a function or class that is given permission to use
index 949475cc66a8721aac5bd9698eb273f2010f3e6b..6ff630c996972ef7823430308a4ab7a9adce0d3c 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -faccess-control -verify %s
+// RUN: %clang_cc1 -fsyntax-only -verify %s
 
 namespace test0 {
   class A {
index 434d8e4fc11ed4e29bdcf0272d331e15570b8296..9bed7cd8fea0df5463213f4fd2f6e564725fda4d 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -faccess-control -verify %s
+// RUN: %clang_cc1 -fsyntax-only -verify %s
 
 // C++0x [class.access]p4:
 
index aaf510a6d11fd948225de08ad1a26ab7861a5fe0..d51d75d05d6dd3f1de829ed66f7c9b466f8b8c2e 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -faccess-control -verify %s
+// RUN: %clang_cc1 -fsyntax-only -verify %s
 
 // C++0x [class.access]p6:
 //   All access controls in [class.access] affect the ability to
index 2b1359c3d8d380ad2775cdac3e47b32d7cb53610..db4c90f564fe8713ef1437dbe990d184783ae4aa 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -verify %s -faccess-control
+// RUN: %clang_cc1 -fsyntax-only -verify %s
 
 struct A { };
 
index f5fbf7a08c20f58defc3001f7e6bebc442d62004..c81e4ef1b1b873d439265e2383916c63807d06d8 100644 (file)
@@ -50,7 +50,7 @@ namespace test1 {
 }
 
 namespace test2 {
-  class Unrelated {
+  struct Unrelated {
     void foo();
   };
 
index 42f6343e069ea5aa7478929de936d0c2d0ee894c..e0748d8923623c631ef48a708b92cd49fa01fd6c 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -faccess-control -verify %s
+// RUN: %clang_cc1 -fsyntax-only -verify %s
 
 struct Base {
   int data;
index 89e9c897d2258049665a8e1c1fc2bbf38b20805f..3581f79b0adfa90bbe28d0ecf13946ff938890c1 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -faccess-control -verify %s
+// RUN: %clang_cc1 -fsyntax-only -verify %s
 
 // We have to avoid ADL for this test.
 
index 00234ac5fd162505e002fad673e537a815326c43..9ab0b489a2c4584cabdbcf1005a2435c9b1a1fac 100644 (file)
@@ -1,6 +1,7 @@
 // RUN: %clang_cc1 -fsyntax-only -verify %s
 
 class C { 
+public:
   void f(int i = 3); // expected-note{{here}}
   void g(int i, int j = 99);
 };
index 4b2b5ae7cbd50150e891cbaaa19663a3b5bb1a10..2fa30e59dca54e7685433e7ded4e440a5e3246c5 100644 (file)
@@ -11,7 +11,7 @@ class T0 { ~T0(); };
 
 // The trivial case, inside a template instantiation.
 template<typename T>
-class T1_A { T *x; ~T1_A() { delete x; } }; // expected-warning {{deleting pointer to incomplete type}}
+struct T1_A { T *x; ~T1_A() { delete x; } }; // expected-warning {{deleting pointer to incomplete type}}
 class T1_B; // expected-note {{forward declaration}}
 void f0() { T1_A<T1_B> x; } // expected-note {{in instantiation of member function}}
 
index cfa14f996bbe5660959775edb8e9709285387a40..e344eedfd6fee30b7f2f759f83c9579f776c42fd 100644 (file)
@@ -1,13 +1,13 @@
 // RUN: %clang_cc1 -fsyntax-only -verify %s
-template<int I, int J, class T> class X { 
+template<int I, int J, class T> struct X { 
   static const int value = 0;
 };
 
-template<int I, int J> class X<I, J, int> { 
+template<int I, int J> struct X<I, J, int> { 
   static const int value = 1;
 };
 
-template<int I> class X<I, I, int> { 
+template<int I> struct X<I, I, int> { 
   static const int value = 2;
 };
 
index 597e06d292bcfa50be86f44a3cc2524f14179b66..03e51321bb2b3ea99223a391e9a929ae176069f1 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -faccess-control -verify -emit-llvm-only %s
+// RUN: %clang_cc1 -verify -emit-llvm-only %s
 
 namespace test0 {
 template <typename T> struct Num {
index d375beb10afd178082a67589982db59449b40588..818407102cfde54c102433d428a51c004baaf801 100644 (file)
@@ -5,7 +5,7 @@ namespace test0 {
   template<typename T> unsigned f0() {
     return T::MaxSize; // expected-error {{'int' cannot be used prior to '::'}}
   };
-  template<typename T> class A {
+  template<typename T> struct A {
     void Allocate(unsigned Alignment
                     = f0<T>()) // expected-note {{in instantiation}}
     {}
index cb8867f2f6a3d5d8fd782b0ebc8a2f2c897adfec..805fe8df698874f60ddb78258cd534d3b6f89c5a 100644 (file)
@@ -1,7 +1,7 @@
 // RUN: %clang_cc1 %s -emit-llvm-only -verify
 
 class x {
-int operator=(int);
+public: int operator=(int);
 };
 void a() {
   x a;
index c2f41e1f0cbf35fc80c1acb06f43d0f19bb25b45..5e751597651885b3e2b2c77329c1f8996d4afd94 100644 (file)
@@ -1,7 +1,7 @@
 // RUN: %clang_cc1 -emit-llvm -o - %s | grep "store i32\* @x, i32\*\*"
 
 int x;
-class A {
+struct A {
   int& y;
   A() : y(x) {}
 };
index 2c95c91e11140dab32dd337cf843678e69a13d2f..e0709055cdbb8dcdc7e38e92a9377debc4fbdb7f 100644 (file)
@@ -12,7 +12,7 @@ struct ValueClass {
 
 
 /* Test basic functionality. */
-class A {
+struct A {
   A(struct Undeclared &);
   A(ValueClass);
   Member mem;
index 86942743d4e173d4b86fbc090e11ea30abc406cb..565a7279c56eed7cc8eb52cee50a9c83b57f633c 100644 (file)
@@ -2,7 +2,7 @@
 // PR6294
 
 class A {
-  virtual ~A();
+public: virtual ~A();
 };
 class B {
   class C;
index 676d2994e7ed499543f6aee86435959e049121c0..49c6f51c775104dc0857dfc34824540f829efb12 100644 (file)
@@ -5,7 +5,7 @@ struct F {
 };
 void G();
 template<class T> class A {
-  A();
+public: A();
 };
 template<class T> A<T>::A() {
   static F f = { G };
index ec9c08c0ccaade64db899e926c13221fd86c3671..ad57c199c424de255eeba03e4f45d52357739444 100644 (file)
@@ -450,7 +450,7 @@ namespace test7 {
 // CHECK: define weak_odr void @_ZN5test81AILZNS_1B5valueEEE3incEv
 namespace test8 {
   template <int &counter> class A { void inc() { counter++; } };
-  class B { static int value; };
+  class B { public: static int value; };
   template class A<B::value>;
 }
 // CHECK: declare void @_ZN5test91fIiNS_3barEEEvRKNT0_3baz1XE
index 38467ad31f9bcd2c7d5a1db004b204e30fa24e8f..49859acf4fa60a999eadcdedfb68191bb5a45a24 100644 (file)
@@ -2,7 +2,7 @@
 // PR5454
 #include <stddef.h>
 
-class X {static void * operator new(size_t size) throw(); X(int); };
+struct X {static void * operator new(size_t size) throw(); X(int); };
 int a(), b();
 void b(int x)
 {
index da64fc1b2d4e03d67d0bf927e52770710250054c..f718faebef000147614b8c042e7e36fc8cbc244e 100644 (file)
@@ -6,6 +6,7 @@
 
 class teste {
   int A;
+public:
   teste() : A(2) {}
 };
 
index 921113a148414853e62f8a360c1721425ac55947..41ae08470a3deaa040e7af0d3e14bd2402510c3e 100644 (file)
@@ -4,6 +4,7 @@ class A
 {
     union { void *d; };
 
+public:
     A() : d(0) { }
 };
 
index 416c0a1a20729edd6279aa9195efbbdff9e08045..4a3857542d06d220dc94259d0a8dd41a6b2a5119 100644 (file)
@@ -40,6 +40,7 @@ namespace test1 {
 namespace test2 {
   template<typename T1>
   class C {
+  public:
     virtual ~C();
     void zedbar(double) {
     }
index 76a1240731b2c554cb596a69ce8aab767c6538a0..b968f38c826364ac5456a7f9398b4a7db7f4e6de 100644 (file)
@@ -1,6 +1,7 @@
 // RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s
 
 template<class T> class A {
+public:
   A() {}
   virtual void a() {}
 };
index efc9ba890c6fabd17007779d658430fcbd3a9c34..dc6789fa86182eab8fbf74f01fc692ca84167998 100644 (file)
@@ -2,6 +2,7 @@
 // RUN: %clang_cc1 -fsyntax-only -fixit -o - %s | %clang_cc1 -fsyntax-only -pedantic -Werror -x c++ -
 namespace std {
   template<typename T> class basic_string { // expected-note 2{{'basic_string' declared here}}
+  public:
     int find(const char *substr); // expected-note{{'find' declared here}}
     static const int npos = -1; // expected-note{{'npos' declared here}}
   };
index 25fd9e52aa258e75aeaac59cfbed016db2213e90..85516902163e70c53be2c34236a26a6e14d2a8b8 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -faccess-control -verify %s
+// RUN: %clang_cc1 -fsyntax-only -verify %s
 namespace T1 {
   
 class A { };
index 1db6704909df4a2865ae8cf1c6396a062a278148..4540e99d8a3376a0f11bdb34fafb93a7651d806f 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -faccess-control -verify %s
+// RUN: %clang_cc1 -fsyntax-only -verify %s
 
 class M {
   int iM;
index 49bcd99fb6951c8e7cc25a313f34c77ebea6ee62..cb78a2e65f22cbf06abc85c04b837988d6568246 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -verify -faccess-control -std=c++0x -Wsign-compare %s
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++0x -Wsign-compare %s
 
 // C++ rules for ?: are a lot stricter than C rules, and have to take into
 // account more conversion options.
index 96dfa8ba5269ec2ae73712750426a31260dd256b..8b23e1300941439d37e5408a4a1258d60d0fc170 100644 (file)
@@ -1,6 +1,7 @@
 // RUN: %clang_cc1 -Wreorder -fsyntax-only -verify %s
 class A { 
   int m;
+public:
    A() : A::m(17) { } // expected-error {{member initializer 'm' does not name a non-static data member or base class}}
    A(int);
 };
@@ -125,7 +126,7 @@ struct Q {
 
 // A silly class used to demonstrate field-is-uninitialized in constructors with
 // multiple params.
-class TwoInOne { TwoInOne(TwoInOne a, TwoInOne b) {} };
+class TwoInOne { public: TwoInOne(TwoInOne a, TwoInOne b) {} };
 class InitializeUsingSelfTest {
   bool A;
   char* B;
index 6a28f4c2c87503a6ff9a0b64872a813a60fb4f56..ccb25f00c24e17d41b6ee81ed5b40eac8bbf6bdf 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -verify -faccess-control %s
+// RUN: %clang_cc1 -fsyntax-only -verify %s
 
 struct A {};
 
index d30642b5c3ec8270704f71b27d2d7bb6d9e96d1e..54cd6cacc0d4fea2c059a78272f80542c0cb02f8 100644 (file)
@@ -10,7 +10,7 @@ void f() {
 }
 
 class Y { 
-  explicit Y(float);
+public: explicit Y(float);
 };
 
 class X { // expected-note{{candidate constructor (the implicit copy constructor)}}
index 4e0486c79ac2aac2b72486ecbe64ff068da583a4..3b088645a65b2cecbc67a2cfcdace66fd077fe25 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -verify -faccess-control %s
+// RUN: %clang_cc1 -fsyntax-only -verify %s
 
 // ------------ not interpreted as C-style cast ------------
 
index cff04ab17a0a2744b06ce38c088bfbcd55dc5cd1..59a8e8c45dc79de266bf3858e6657614afb021de 100644 (file)
@@ -194,7 +194,7 @@ somens::a a3 = a2; // expected-error {{no viable conversion}}
 // typedefs and using declarations.
 namespace test1 {
   namespace ns {
-    class Counter { static int count; };
+    class Counter { public: static int count; };
     typedef Counter counter;
   }
   using ns::counter;
index ae77e704f5011d99dba84ac6270ed9bd58a0d286..50aba47410a4e3657355cd7d3cc7106822aaedf8 100644 (file)
@@ -182,6 +182,7 @@ void f(X8 *x8) {
 }
 
 class X9 {
+public:
   static void operator delete(void*, int); // expected-note {{'operator delete' declared here}}
   static void operator delete(void*, float); // expected-note {{'operator delete' declared here}}
 };
@@ -216,6 +217,7 @@ static void* f(void* g)
 }
 
 class X14 {
+public:
   static void operator delete(void*, const size_t);
 };
 
index 89f181469fdf3112ec72dbe4f8504055959113fa..82f000b805de680f5a2fa86c1bbc3cc550f9b898 100644 (file)
@@ -88,6 +88,7 @@ enum pr5244_bar
 
 class pr5244_baz
 {
+public:
     pr5244_bar quux;
 };
 
index a5dd7e214dc288d34675718c855e64d2c122b730..48f641aa997b2ae6b62f8454aa41b0d12836e6c1 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -verify -faccess-control %s
+// RUN: %clang_cc1 -fsyntax-only -verify %s
 struct A {};
 struct B : public A {};             // Single public base.
 struct C1 : public virtual B {};    // Single virtual base.
index 688713582657415ff80d49a3f331901a48055666..e07531f64365cb554f58558ec41cb5854be7d052 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -faccess-control -verify %s -std=c++0x
+// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++0x
 namespace T1 {
 
 class A {
index a2d3c56501e821c510d01f7e92a25dfd153ba7e0..77961069c5a22fad4b72c6a848bd5d8f92f45072 100644 (file)
@@ -18,15 +18,18 @@ template<class T> class R : Q<T> {T current;};
 
 namespace test0 {
   template <class T> class Base {
+  public:
     void instance_foo();
     static void static_foo();
     class Inner {
+    public:
       void instance_foo();
       static void static_foo();
     };
   };
 
   template <class T> class Derived1 : Base<T> {
+  public:
     void test0() {
       Base<T>::static_foo();
       Base<T>::instance_foo();
@@ -49,6 +52,7 @@ namespace test0 {
   };
 
   template <class T> class Derived2 : Base<T>::Inner {
+  public:
     void test0() {
       Base<T>::static_foo();
       Base<T>::instance_foo(); // expected-error {{call to non-static member function without an object argument}}
index 72ad90a04f20af56d119b09f5d12ff44845963c3..d57ba8a68288bbe529c2346c55f2e28784f177bd 100644 (file)
@@ -13,11 +13,11 @@ template void f0<int>();
 
 // PR5764
 namespace PR5764 {
-  class X {
+  struct X {
     template <typename T>
     void Bar() {
       typedef T ValueType;
-      class Y {
+      struct Y {
         Y() { V = ValueType(); }
 
         ValueType V;
index 938c57b75e916909241715e195f6ed106f188944..f1bdf3e1e6d5a684a784eeacff6bdaf8cd15e0fe 100644 (file)
@@ -40,9 +40,9 @@ X<void>::D::E e2; // expected-note{{in instantiation of member class 'X<void>::D
 // Redeclarations.
 namespace test1 {
   template <typename T> struct Registry {
-    class node;
+    struct node;
     static node *Head;
-    class node {
+    struct node {
       node(int v) { Head = this; }
     };
   };
@@ -64,6 +64,7 @@ namespace test2 {
   template <typename T> class B {
     class Foo;
     class Foo {
+    public:
       typedef int X;
     };
     typename Foo::X x;
index e0594347f26223bfba330ea41c165ed4fd1810d9..ca94bef2265d64286a3e8a9fe2bb8000527e9efe 100644 (file)
@@ -21,6 +21,7 @@ B<int> b0; // expected-note {{in instantiation of member function 'B<int>::B' re
 
 template <class T> struct AA { AA(int); };
 template <class T> class BB : public AA<T> {
+public:
   BB() : AA<T>(1) {}
 };
 BB<int> x;
index a4394aa21f6e50b690963bd5faca3a86e58587e1..257904490daab7c22f73e2e614c9c9d1d80ea3d6 100644 (file)
@@ -38,7 +38,7 @@ namespace test1 {
     using Base2::Visit;
   };
 
-  class Knot : JoinVisitor<Knot> {
+  class Knot : public JoinVisitor<Knot> {
   };
 
   void test() {
index 2e3a826ce894264759b7a71c73b2db22e4329f38..29eab89d84f557b83ee79ad7daf0f7fd719ea7b5 100644 (file)
@@ -21,6 +21,7 @@ namespace test1 {
 
 namespace test2 {
   class Impl {
+  public:
     int foo();
   };
   template <class T> class Magic : public Impl {