diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -6109,7 +6109,8 @@ TL.setArgLocInfo(I, TemplateArgsInfo.arguments()[I].getLocInfo()); } void VisitTagTypeLoc(TagTypeLoc TL) { - TL.setNameLoc(DS.getTypeSpecTypeNameLoc()); + if (DS.getTypeSpecType() != DeclSpec::TST_typeofExpr) + TL.setNameLoc(DS.getTypeSpecTypeNameLoc()); } void VisitAtomicTypeLoc(AtomicTypeLoc TL) { // An AtomicTypeLoc can come from either an _Atomic(...) type specifier diff --git a/clang/test/Sema/atomic-typeof.c b/clang/test/Sema/atomic-typeof.c new file mode 100644 --- /dev/null +++ b/clang/test/Sema/atomic-typeof.c @@ -0,0 +1,6 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c11 -x c %s + +struct dispatch_object_s; +void _dispatch_queue_get_head(struct dispatch_object_s * volatile dq_items_head) { + (_Atomic __typeof__(dq_items_head) *)dq_items_head; +}