diff --git a/clang-tools-extra/clang-tidy/bugprone/UnusedRaiiCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/UnusedRaiiCheck.cpp --- a/clang-tools-extra/clang-tidy/bugprone/UnusedRaiiCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/UnusedRaiiCheck.cpp @@ -29,10 +29,11 @@ Finder->addMatcher( mapAnyOf(cxxConstructExpr, cxxUnresolvedConstructExpr) .with(hasParent(compoundStmt().bind("compound")), - anyOf(hasType(cxxRecordDecl(hasNonTrivialDestructor())), - hasType(templateSpecializationType( + anyOf(hasType(hasCanonicalType(recordType(hasDeclaration( + cxxRecordDecl(hasNonTrivialDestructor()))))), + hasType(hasCanonicalType(templateSpecializationType( hasDeclaration(classTemplateDecl(has( - cxxRecordDecl(hasNonTrivialDestructor())))))))) + cxxRecordDecl(hasNonTrivialDestructor()))))))))) .bind("expr"), this); } diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone-unused-raii.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone-unused-raii.cpp --- a/clang-tools-extra/test/clang-tidy/checkers/bugprone-unused-raii.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone-unused-raii.cpp @@ -82,6 +82,28 @@ (void)i; } +template +void aliastest() { + using X = Foo; + using Y = X; + using Z = Y; + Z(42); + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: object destroyed immediately after creation; did you mean to name the object? + // CHECK-FIXES: Z give_me_a_name(42); + + typedef Z ZT; + ZT(42, 13); + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: object destroyed immediately after creation; did you mean to name the object? + // CHECK-FIXES: ZT give_me_a_name(42, 13); + + using TT = TCtorDefaultArg; + TT(42); + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: object destroyed immediately after creation; did you mean to name the object? + // CHECK-FIXES: TT give_me_a_name(42); + + (void)0; +} + void test() { Foo(42); // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: object destroyed immediately after creation; did you mean to name the object?