Index: lib/AST/ASTContext.cpp =================================================================== --- lib/AST/ASTContext.cpp +++ lib/AST/ASTContext.cpp @@ -2771,7 +2771,7 @@ // Anything else must be a function type. Rebuild it with the new exception // specification. - const auto *Proto = cast(Orig); + const auto *Proto = Orig->getAs(); return getFunctionType( Proto->getReturnType(), Proto->getParamTypes(), Proto->getExtProtoInfo().withExceptionSpec(ESI)); Index: test/AST/function-alias.cpp =================================================================== --- test/AST/function-alias.cpp +++ test/AST/function-alias.cpp @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 -std=c++17 -fsyntax-only %s + +// Verify that ASTContext::getFunctionTypeWithExceptionSpec (called through +// ASTContext::hasSameFunctionTypeIgnoringExceptionSpec from +// ExprEvaluatorBase::handleCallExpr in lib/AST/ExprConstant.cpp) does not crash +// for a type alias. + +constexpr int f() noexcept { return 0; } + +using F = int(); + +constexpr int g(F * p) { return p(); } + +constexpr int n = g(f);