summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaDeclCXX.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Sema/SemaDeclCXX.cpp')
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp30
1 files changed, 14 insertions, 16 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 48373369bcf..5ba2850a3f0 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -1230,21 +1230,6 @@ Sema::DeclTy *Sema::ActOnConversionDeclarator(CXXConversionDecl *Conversion) {
// Make sure we aren't redeclaring the conversion function.
QualType ConvType = Context.getCanonicalType(Conversion->getConversionType());
- OverloadedFunctionDecl *Conversions = ClassDecl->getConversionFunctions();
- for (OverloadedFunctionDecl::function_iterator Func
- = Conversions->function_begin();
- Func != Conversions->function_end(); ++Func) {
- CXXConversionDecl *OtherConv = cast<CXXConversionDecl>(*Func);
- if (ConvType == Context.getCanonicalType(OtherConv->getConversionType())) {
- Diag(Conversion->getLocation(), diag::err_conv_function_redeclared);
- Diag(OtherConv->getLocation(),
- OtherConv->isThisDeclarationADefinition()?
- diag::note_previous_definition
- : diag::note_previous_declaration);
- Conversion->setInvalidDecl();
- return (DeclTy *)Conversion;
- }
- }
// C++ [class.conv.fct]p1:
// [...] A conversion function is never used to convert a
@@ -1272,7 +1257,20 @@ Sema::DeclTy *Sema::ActOnConversionDeclarator(CXXConversionDecl *Conversion) {
<< ClassType << ConvType;
}
- ClassDecl->addConversionFunction(Context, Conversion);
+ if (Conversion->getPreviousDeclaration()) {
+ OverloadedFunctionDecl *Conversions = ClassDecl->getConversionFunctions();
+ for (OverloadedFunctionDecl::function_iterator
+ Conv = Conversions->function_begin(),
+ ConvEnd = Conversions->function_end();
+ Conv != ConvEnd; ++Conv) {
+ if (*Conv == Conversion->getPreviousDeclaration()) {
+ *Conv = Conversion;
+ return (DeclTy *)Conversion;
+ }
+ }
+ assert(Conversion->isInvalidDecl() && "Conversion should not get here.");
+ } else
+ ClassDecl->addConversionFunction(Context, Conversion);
return (DeclTy *)Conversion;
}
OpenPOWER on IntegriCloud