18 auto NonConstAndNonFunctionPointerType = hasType(pointerType(unless(
19 pointee(anyOf(isConstQualified(), ignoringParens(functionType()))))));
23 hasType(qualType(isConstQualified(),
24 typedefType(hasDeclaration(anyOf(
25 typedefDecl(NonConstAndNonFunctionPointerType)
27 typeAliasDecl(NonConstAndNonFunctionPointerType)
28 .bind(
"typeAlias")))))))
50 const auto *Var = Result.Nodes.getNodeAs<ValueDecl>(
"decl");
51 const ASTContext &Ctx = *Result.Context;
52 const QualType CanQT = Var->getType().getCanonicalType();
54 SourceLocation AliasLoc;
55 const char *AliasType =
nullptr;
56 if (
const auto *Typedef = Result.Nodes.getNodeAs<TypedefDecl>(
"typedef")) {
57 AliasLoc = Typedef->getLocation();
58 AliasType =
"typedef";
59 }
else if (
const auto *TypeAlias =
60 Result.Nodes.getNodeAs<TypeAliasDecl>(
"typeAlias")) {
61 AliasLoc = TypeAlias->getLocation();
62 AliasType =
"type alias";
64 llvm_unreachable(
"registerMatchers has registered an unknown matcher,"
68 diag(Var->getLocation(),
"%0 declared with a const-qualified %1; "
69 "results in the type being '%2' instead of '%3'")
70 << Var << AliasType << CanQT.getAsString(Ctx.getPrintingPolicy())
72 .getAsString(Ctx.getPrintingPolicy());
73 diag(AliasLoc,
"%0 declared here", DiagnosticIDs::Note) << AliasType;