forked from OSchip/llvm-project
PR12798: Don't drop part of the nested name specifier when instantiating a
pseudo-destructor expression. This can affect whether virtual dispatch for the destructor call is bypassed. llvm-svn: 156806
This commit is contained in:
parent
5db7f6cb1e
commit
8e4a3868fe
|
@ -9268,7 +9268,11 @@ TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
|
|||
DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
|
||||
NameInfo.setNamedTypeInfo(DestroyedType);
|
||||
|
||||
// FIXME: the ScopeType should be tacked onto SS.
|
||||
// The scope type is now known to be a valid nested name specifier
|
||||
// component. Tack it on to the end of the nested name specifier.
|
||||
if (ScopeType)
|
||||
SS.Extend(SemaRef.Context, SourceLocation(),
|
||||
ScopeType->getTypeLoc(), CCLoc);
|
||||
|
||||
SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
|
||||
return getSema().BuildMemberReferenceExpr(Base, BaseType,
|
||||
|
|
|
@ -46,3 +46,14 @@ C::~C() { }
|
|||
// CHECK: call void @_ZdlPv
|
||||
|
||||
// Base dtor: just an alias to B's base dtor.
|
||||
|
||||
namespace PR12798 {
|
||||
// A qualified call to a base class destructor should not undergo virtual
|
||||
// dispatch. Template instantiation used to lose the qualifier.
|
||||
struct A { virtual ~A(); };
|
||||
template<typename T> void f(T *p) { p->A::~A(); }
|
||||
|
||||
// CHECK: define {{.*}} @_ZN7PR127981fINS_1AEEEvPT_(
|
||||
// CHECK: call void @_ZN7PR127981AD1Ev(
|
||||
template void f(A*);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue