diff --git a/clang/lib/AST/ComputeDependence.cpp b/clang/lib/AST/ComputeDependence.cpp index 8429f17d26be5..620345536bb3d 100644 --- a/clang/lib/AST/ComputeDependence.cpp +++ b/clang/lib/AST/ComputeDependence.cpp @@ -721,6 +721,9 @@ ExprDependence clang::computeDependence(GenericSelectionExpr *E, : ExprDependence::None; for (auto *AE : E->getAssocExprs()) D |= AE->getDependence() & ExprDependence::Error; + for (auto *TSI : E->getAssocTypeSourceInfos()) + if (TSI && TSI->getType()->containsErrors()) + D |= ExprDependence::Error; if (E->isExprPredicate()) D |= E->getControllingExpr()->getDependence() & ExprDependence::Error; diff --git a/clang/test/Sema/generic-selection.c b/clang/test/Sema/generic-selection.c index 8e7b6ed00dd50..9635150909058 100644 --- a/clang/test/Sema/generic-selection.c +++ b/clang/test/Sema/generic-selection.c @@ -44,6 +44,8 @@ int __attribute__((overloadable)) test (int); double __attribute__((overloadable)) test (double); char testc(char); +int f(int); + void PR30201(void) { _Generic(4, char:testc, default:test)(4); // ext-warning {{'_Generic' is a C11 extension}} } @@ -86,3 +88,5 @@ void GH55562(void) { struct S s = { 0 }; int i = s.a; } + +char *a = _Generic("", char (*)[f(x)]: ""); // expected-error {{use of undeclared identifier 'x'}} ext-warning {{'_Generic' is a C11 extension}}