Index: clang/lib/Sema/SemaCast.cpp =================================================================== --- clang/lib/Sema/SemaCast.cpp +++ clang/lib/Sema/SemaCast.cpp @@ -3328,6 +3328,9 @@ if (auto *ConstructExpr = dyn_cast(SubExpr)) ConstructExpr->setParenOrBraceRange(SourceRange(LPLoc, RPLoc)); + // -Wcast-qual + DiagnoseCastQual(Op.Self, Op.SrcExpr, Op.DestType); + return Op.complete(CXXFunctionalCastExpr::Create( Context, Op.ResultType, Op.ValueKind, CastTypeInfo, Op.Kind, Op.SrcExpr.get(), &Op.BasePath, CurFPFeatureOverrides(), LPLoc, RPLoc)); Index: clang/test/SemaCXX/warn-cast-qual.cpp =================================================================== --- clang/test/SemaCXX/warn-cast-qual.cpp +++ clang/test/SemaCXX/warn-cast-qual.cpp @@ -138,3 +138,29 @@ *(int *)(&S.b) = 0; // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}} } } + +void qux_0() { + const auto i = 42; + using T = int*; + auto p = T(&i); // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}} + + const auto i2 = 42; + using T2 = const int*; + auto p2 = T2(&i2); + + volatile auto i3 = 42; + using T3= int*; + auto p3 = T3(&i3); // expected-warning {{cast from 'volatile int *' to 'int *' drops volatile qualifier}} + + volatile auto i4 = 42; + using T4 = volatile int*; + auto p4 = T4(&i4); + + const volatile auto i5 = 42; + using T5= int*; + auto p5 = T5(&i5); // expected-warning {{cast from 'const volatile int *' to 'int *' drops const and volatile qualifiers}} + + const volatile auto i6 = 42; + using T6= const volatile int*; + auto p6 = T6(&i6); +}