Index: clang/lib/Basic/Builtins.cpp =================================================================== --- clang/lib/Basic/Builtins.cpp +++ clang/lib/Basic/Builtins.cpp @@ -58,8 +58,12 @@ bool Builtin::Context::builtinIsSupported(const Builtin::Info &BuiltinInfo, const LangOptions &LangOpts) { bool BuiltinsUnsupported = - (LangOpts.NoBuiltin || LangOpts.isNoBuiltinFunc(BuiltinInfo.Name)) && - strchr(BuiltinInfo.Attributes, 'f'); + ((LangOpts.NoBuiltin || LangOpts.isNoBuiltinFunc(BuiltinInfo.Name)) && + strchr(BuiltinInfo.Attributes, 'f') || + // if we are not compiling with -fcoroutine-ts option then, + // disable the coroutine intrinsic. + (!LangOpts.Coroutines && + strstr(BuiltinInfo.Name, "__builtin_coro") != 0)); bool MathBuiltinsUnsupported = LangOpts.NoMathBuiltin && BuiltinInfo.HeaderName && llvm::StringRef(BuiltinInfo.HeaderName).equals("math.h"); Index: clang/test/SemaCXX/coroutine-builtins.cpp =================================================================== --- /dev/null +++ clang/test/SemaCXX/coroutine-builtins.cpp @@ -0,0 +1,19 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -fcoroutines-ts %s +// RUN: %clang_cc1 -fsyntax-only -verify -DERRORS %s + +// Check that we don't crash when using __builtin_coro_* without the fcoroutine-ts option + +int main() { + void *co_h; + +#ifdef ERRORS +// expected-error@+6{{use of undeclared identifier '__builtin_coro_done'}} +// expected-error@+6{{use of undeclared identifier '__builtin_coro_id'}} +// expected-error@+6{{use of undeclared identifier '__builtin_coro_alloc'}} +#else +// expected-no-diagnostics +#endif + bool d = __builtin_coro_done(co_h); + __builtin_coro_id(32, 0, 0, 0); + __builtin_coro_alloc(); +}