Index: clang/lib/AST/ExprConstant.cpp =================================================================== --- clang/lib/AST/ExprConstant.cpp +++ clang/lib/AST/ExprConstant.cpp @@ -9509,6 +9509,8 @@ // Figure out how many T's we're copying. uint64_t TSize = Info.Ctx.getTypeSizeInChars(T).getQuantity(); + if (TSize == 0) + return false; if (!WChar) { uint64_t Remainder; llvm::APInt OrigN = N; Index: clang/test/Sema/builtin-memcpy.c =================================================================== --- /dev/null +++ clang/test/Sema/builtin-memcpy.c @@ -0,0 +1,8 @@ +// RUN: %clang_cc1 %s -fsyntax-only -verify + +/// Zero-sized structs should not crash. +int b() { + struct { } a[10]; + __builtin_memcpy(&a[2], a, 2); // expected-warning {{buffer has size 0, but size argument is 2}} + return 0; +}