Skip to content

Commit 55cbbce

Browse files
authored
[clang][ASTImporter] Fix of unchecked Error object (#112688)
After commits 9c72a30 and 30a9cac error handling in function 'importTemplateParameterDefaultArgument' was not correct, probably related to (not) using std::move. A crash with unchecked Error result could happen when the import error path was taken. Here a test is added that reproduces this case and the problem is fixed.
1 parent 8e6abf5 commit 55cbbce

File tree

2 files changed

+41
-13
lines changed

2 files changed

+41
-13
lines changed

clang/lib/AST/ASTImporter.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -362,24 +362,24 @@ namespace clang {
362362
template <typename TemplateParmDeclT>
363363
Error importTemplateParameterDefaultArgument(const TemplateParmDeclT *D,
364364
TemplateParmDeclT *ToD) {
365-
Error Err = Error::success();
366365
if (D->hasDefaultArgument()) {
367366
if (D->defaultArgumentWasInherited()) {
368-
auto *ToInheritedFrom = const_cast<TemplateParmDeclT *>(
369-
importChecked(Err, D->getDefaultArgStorage().getInheritedFrom()));
370-
if (Err)
371-
return Err;
367+
Expected<TemplateParmDeclT *> ToInheritedFromOrErr =
368+
import(D->getDefaultArgStorage().getInheritedFrom());
369+
if (!ToInheritedFromOrErr)
370+
return ToInheritedFromOrErr.takeError();
371+
TemplateParmDeclT *ToInheritedFrom = *ToInheritedFromOrErr;
372372
if (!ToInheritedFrom->hasDefaultArgument()) {
373373
// Resolve possible circular dependency between default value of the
374374
// template argument and the template declaration.
375-
const auto ToInheritedDefaultArg =
376-
importChecked(Err, D->getDefaultArgStorage()
377-
.getInheritedFrom()
378-
->getDefaultArgument());
379-
if (Err)
380-
return Err;
375+
Expected<TemplateArgumentLoc> ToInheritedDefaultArgOrErr =
376+
import(D->getDefaultArgStorage()
377+
.getInheritedFrom()
378+
->getDefaultArgument());
379+
if (!ToInheritedDefaultArgOrErr)
380+
return ToInheritedDefaultArgOrErr.takeError();
381381
ToInheritedFrom->setDefaultArgument(Importer.getToContext(),
382-
ToInheritedDefaultArg);
382+
*ToInheritedDefaultArgOrErr);
383383
}
384384
ToD->setInheritedDefaultArgument(ToD->getASTContext(),
385385
ToInheritedFrom);
@@ -395,7 +395,7 @@ namespace clang {
395395
*ToDefaultArgOrErr);
396396
}
397397
}
398-
return Err;
398+
return Error::success();
399399
}
400400

401401
public:

clang/unittests/AST/ASTImporterTest.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9986,6 +9986,34 @@ TEST_P(ImportTemplateParmDeclDefaultValue, InvisibleInheritedFrom) {
99869986
ToFDef->getTemplateParameters()->getParam(0));
99879987
}
99889988

9989+
TEST_P(ImportTemplateParmDeclDefaultValue, DefValImportError) {
9990+
const char *ToCode =
9991+
R"(
9992+
class X {
9993+
int A;
9994+
};
9995+
)";
9996+
getToTuDecl(ToCode, Lang_CXX14);
9997+
9998+
const char *FromCode =
9999+
R"(
10000+
class X;
10001+
10002+
template <typename P = X>
10003+
void f() {}
10004+
10005+
class X {
10006+
char A;
10007+
};
10008+
)";
10009+
TranslationUnitDecl *FromTU = getTuDecl(FromCode, Lang_CXX14);
10010+
auto *FromF = FirstDeclMatcher<FunctionTemplateDecl>().match(
10011+
FromTU, functionTemplateDecl(hasName("f")));
10012+
10013+
auto *ToFImported = Import(FromF, Lang_CXX14);
10014+
EXPECT_FALSE(ToFImported);
10015+
}
10016+
998910017
TEST_P(ImportTemplateParmDeclDefaultValue, ImportFunctionTemplate) {
999010018
TranslationUnitDecl *FromTU = getTuDecl(CodeFunction, Lang_CXX14);
999110019
auto *D3 = LastDeclMatcher<FunctionTemplateDecl>().match(

0 commit comments

Comments
 (0)