diff options
-rw-r--r-- | lib/Sema/SemaOverload.cpp | 5 | ||||
-rw-r--r-- | test/CXX/class.access/p4.cpp | 6 |
2 files changed, 11 insertions, 0 deletions
diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index 5506eeb4b2..55259fca4f 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -6231,6 +6231,8 @@ Sema::BuildCallToObjectOfClassType(Scope *S, Expr *Object, = cast<CXXConversionDecl>( Best->Conversions[0].UserDefined.ConversionFunction); + // FIXME: access control + // We selected one of the surrogate functions that converts the // object parameter to a function pointer. Perform the conversion // on the object argument, then let ActOnCallExpr finish the job. @@ -6244,6 +6246,9 @@ Sema::BuildCallToObjectOfClassType(Scope *S, Expr *Object, CommaLocs, RParenLoc).release(); } + if (getLangOptions().AccessControl) + CheckAccess(R, Best->Function, Best->getAccess()); + // We found an overloaded operator(). Build a CXXOperatorCallExpr // that calls this method, using Object for the implicit object // parameter and passing along the remaining arguments. diff --git a/test/CXX/class.access/p4.cpp b/test/CXX/class.access/p4.cpp index 3f4397a28b..0df17919a3 100644 --- a/test/CXX/class.access/p4.cpp +++ b/test/CXX/class.access/p4.cpp @@ -38,12 +38,15 @@ namespace test1 { public: void operator+(Public&); void operator[](Public&); + void operator()(Public&); protected: void operator+(Protected&); // expected-note {{declared protected here}} void operator[](Protected&); // expected-note {{declared protected here}} + void operator()(Protected&); // expected-note {{declared protected here}} private: void operator+(Private&); // expected-note {{declared private here}} void operator[](Private&); // expected-note {{declared private here}} + void operator()(Private&); // expected-note {{declared private here}} void operator-(); // expected-note {{declared private here}} }; void operator+(const A &, Public&); @@ -58,6 +61,9 @@ namespace test1 { a[pub]; a[prot]; // expected-error {{access to protected member}} a[priv]; // expected-error {{access to private member}} + a(pub); + a(prot); // expected-error {{access to protected member}} + a(priv); // expected-error {{access to private member}} -a; // expected-error {{access to private member}} const A &ca = a; |