[PATCH] D78444: Perform ActOnConversionDeclarator after looking for any virtual functions it overrides
Ronald Wampler via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Sat Apr 18 22:04:51 PDT 2020
rdwampler created this revision.
rdwampler added reviewers: saar.raz, aaron.ballman, doug.gregor, rsmith.
rdwampler added a project: clang.
Herald added subscribers: cfe-commits, dexonsmith.
This allows for suppressing warnings about the conversion function never being called if it overrides a virtual function in a base class.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D78444
Files:
clang/lib/Sema/SemaDecl.cpp
clang/lib/Sema/SemaDeclCXX.cpp
clang/test/SemaCXX/conversion-function.cpp
Index: clang/test/SemaCXX/conversion-function.cpp
===================================================================
--- clang/test/SemaCXX/conversion-function.cpp
+++ clang/test/SemaCXX/conversion-function.cpp
@@ -62,6 +62,27 @@
operator const B(); // expected-warning{{conversion function converting 'B' to itself will never be used}}
};
+class DerivedB;
+
+class BaseA {
+public:
+ virtual operator BaseA&() = 0; //OK. Virtual function
+ virtual operator DerivedB&() = 0; //OK. Virtual function
+ virtual operator const void() = 0; //OK. Virtual function
+};
+
+class DerivedB : public BaseA {
+#if __cplusplus >= 201103L
+ operator BaseA&() override; //OK. Overrides virtual function in BaseA
+ operator DerivedB&() override; //OK. Overrides virtual function BaseA
+ operator const void() override; //OK. Overrides virtual function BaseA
+#else
+ virtual operator BaseA&(); //OK. Overrides virtual function in BaseA
+ virtual operator DerivedB&(); //OK. Overrides virtual function BaseA
+ virtual operator const void(); //OK. Overrides virtual function BaseA
+#endif
+};
+
// This used to crash Clang.
struct Flip;
struct Flop {
Index: clang/lib/Sema/SemaDeclCXX.cpp
===================================================================
--- clang/lib/Sema/SemaDeclCXX.cpp
+++ clang/lib/Sema/SemaDeclCXX.cpp
@@ -10486,15 +10486,12 @@
// Make sure we aren't redeclaring the conversion function.
QualType ConvType = Context.getCanonicalType(Conversion->getConversionType());
-
// C++ [class.conv.fct]p1:
// [...] A conversion function is never used to convert a
// (possibly cv-qualified) object to the (possibly cv-qualified)
// same object type (or a reference to it), to a (possibly
// cv-qualified) base class of that type (or a reference to it),
// or to (possibly cv-qualified) void.
- // FIXME: Suppress this warning if the conversion function ends up being a
- // virtual function that overrides a virtual function in a base class.
QualType ClassType
= Context.getCanonicalType(Context.getTypeDeclType(ClassDecl));
if (const ReferenceType *ConvTypeRef = ConvType->getAs<ReferenceType>())
@@ -10502,6 +10499,8 @@
if (Conversion->getTemplateSpecializationKind() != TSK_Undeclared &&
Conversion->getTemplateSpecializationKind() != TSK_ExplicitSpecialization)
/* Suppress diagnostics for instantiations. */;
+ else if(Conversion->isVirtual())
+ /*Suppress diagnostics if the function is virtual*/;
else if (ConvType->isRecordType()) {
ConvType = Context.getCanonicalType(ConvType).getUnqualifiedType();
if (ConvType == ClassType)
Index: clang/lib/Sema/SemaDecl.cpp
===================================================================
--- clang/lib/Sema/SemaDecl.cpp
+++ clang/lib/Sema/SemaDecl.cpp
@@ -10713,9 +10713,6 @@
return Redeclaration;
}
}
- } else if (CXXConversionDecl *Conversion
- = dyn_cast<CXXConversionDecl>(NewFD)) {
- ActOnConversionDeclarator(Conversion);
} else if (auto *Guide = dyn_cast<CXXDeductionGuideDecl>(NewFD)) {
if (auto *TD = Guide->getDescribedFunctionTemplate())
CheckDeductionGuideTemplate(TD);
@@ -10743,6 +10740,9 @@
if (Method->isStatic())
checkThisInStaticMemberFunctionType(Method);
}
+
+ if (CXXConversionDecl *Conversion = dyn_cast<CXXConversionDecl>(NewFD))
+ ActOnConversionDeclarator(Conversion);
// Extra checking for C++ overloaded operators (C++ [over.oper]).
if (NewFD->isOverloadedOperator() &&
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D78444.258577.patch
Type: text/x-patch
Size: 3577 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200419/bd1c938e/attachment.bin>
More information about the cfe-commits
mailing list