Don't crash on hierarchy static_casts which appear in variable initializers.

PR9221.

llvm-svn: 125532
This commit is contained in:
John McCall 2011-02-14 23:21:33 +00:00
parent 5623dc3559
commit fe9cf0abb7
2 changed files with 44 additions and 11 deletions

View File

@ -981,13 +981,21 @@ TryStaticDowncast(Sema &Self, CanQualType SrcType, CanQualType DestType,
return TC_Failed;
}
if (!CStyle && Self.CheckBaseClassAccess(OpRange.getBegin(),
if (!CStyle) {
switch (Self.CheckBaseClassAccess(OpRange.getBegin(),
SrcType, DestType,
Paths.front(),
diag::err_downcast_from_inaccessible_base)) {
case Sema::AR_accessible:
case Sema::AR_delayed: // be optimistic
case Sema::AR_dependent: // be optimistic
break;
case Sema::AR_inaccessible:
msg = 0;
return TC_Failed;
}
}
Self.BuildBasePathArray(Paths, BasePath);
Kind = CK_BaseToDerived;
@ -1065,13 +1073,23 @@ TryStaticMemberPointerUpcast(Sema &Self, Expr *&SrcExpr, QualType SrcType,
return TC_Failed;
}
if (!CStyle && Self.CheckBaseClassAccess(OpRange.getBegin(),
if (!CStyle) {
switch (Self.CheckBaseClassAccess(OpRange.getBegin(),
DestClass, SrcClass,
Paths.front(),
diag::err_upcast_to_inaccessible_base)) {
case Sema::AR_accessible:
case Sema::AR_delayed:
case Sema::AR_dependent:
// Optimistically assume that the delayed and dependent cases
// will work out.
break;
case Sema::AR_inaccessible:
msg = 0;
return TC_Failed;
}
}
if (WasOverloadedFunction) {
// Resolve the address of the overloaded function again, this time

View File

@ -326,3 +326,18 @@ namespace test11 {
void A::test2(B::private_type x) {} // expected-error {{'private_type' is a private member of 'test11::B'}}
void A::test3(int x = B::private_type()) {} // expected-error {{'private_type' is a private member of 'test11::B'}}
}
// PR9221
namespace test12 {
struct A {
void foo();
};
class B : private A {
friend void A::foo();
void *mem;
};
void A::foo() {
void *var = static_cast<B*>(this)->mem;
}
}