Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 4 Nov 2018 14:42:02 +0000 (UTC)
From:      Dimitry Andric <dim@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-vendor@freebsd.org
Subject:   svn commit: r340118 - in vendor/clang/dist-release_70: bindings/python/tests/cindex include/clang/AST include/clang/Driver include/clang/Sema lib/Basic lib/CodeGen lib/Driver lib/Driver/ToolChains ...
Message-ID:  <201811041442.wA4Eg2wB060950@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: dim
Date: Sun Nov  4 14:42:02 2018
New Revision: 340118
URL: https://svnweb.freebsd.org/changeset/base/340118

Log:
  Vendor import of clang release_70 branch r346007:
  https://llvm.org/svn/llvm-project/cfe/branches/release_70@346007

Added:
  vendor/clang/dist-release_70/test/PCH/Inputs/pch-through-use3c.cpp   (contents, props changed)
  vendor/clang/dist-release_70/test/PCH/Inputs/pch-through3c.h   (contents, props changed)
  vendor/clang/dist-release_70/test/PCH/pch-through3c.cpp   (contents, props changed)
Modified:
  vendor/clang/dist-release_70/bindings/python/tests/cindex/test_code_completion.py
  vendor/clang/dist-release_70/include/clang/AST/Decl.h
  vendor/clang/dist-release_70/include/clang/Driver/Options.td
  vendor/clang/dist-release_70/include/clang/Sema/Sema.h
  vendor/clang/dist-release_70/lib/Basic/Version.cpp
  vendor/clang/dist-release_70/lib/CodeGen/CGBuiltin.cpp
  vendor/clang/dist-release_70/lib/Driver/Driver.cpp
  vendor/clang/dist-release_70/lib/Driver/ToolChains/Gnu.cpp
  vendor/clang/dist-release_70/lib/Sema/SemaDecl.cpp
  vendor/clang/dist-release_70/lib/Sema/SemaOverload.cpp
  vendor/clang/dist-release_70/lib/Sema/SemaTemplate.cpp
  vendor/clang/dist-release_70/test/CodeGen/attr-target-mv.c
  vendor/clang/dist-release_70/test/CodeGen/builtin-cpu-supports.c
  vendor/clang/dist-release_70/test/Driver/cl-options.c
  vendor/clang/dist-release_70/test/Driver/cl-pch.cpp
  vendor/clang/dist-release_70/test/Driver/linux-ld.c
  vendor/clang/dist-release_70/test/SemaCXX/cxx1y-deduced-return-type.cpp
  vendor/clang/dist-release_70/test/SemaCXX/friend.cpp

Modified: vendor/clang/dist-release_70/bindings/python/tests/cindex/test_code_completion.py
==============================================================================
--- vendor/clang/dist-release_70/bindings/python/tests/cindex/test_code_completion.py	Sun Nov  4 14:41:54 2018	(r340117)
+++ vendor/clang/dist-release_70/bindings/python/tests/cindex/test_code_completion.py	Sun Nov  4 14:42:02 2018	(r340118)
@@ -61,11 +61,11 @@ void f(P x, Q y) {
         cr = tu.codeComplete('fake.cpp', 12, 5, unsaved_files=files)
 
         expected = [
-          "{'const', TypedText} || Priority: 40 || Availability: Available || Brief comment: None",
-          "{'volatile', TypedText} || Priority: 40 || Availability: Available || Brief comment: None",
+          "{'const', TypedText} || Priority: 50 || Availability: Available || Brief comment: None",
+          "{'volatile', TypedText} || Priority: 50 || Availability: Available || Brief comment: None",
           "{'operator', TypedText} || Priority: 40 || Availability: Available || Brief comment: None",
-          "{'P', TypedText} | {'::', Text} || Priority: 75 || Availability: Available || Brief comment: None",
-          "{'Q', TypedText} | {'::', Text} || Priority: 75 || Availability: Available || Brief comment: None"
+          "{'P', TypedText} || Priority: 50 || Availability: Available || Brief comment: None",
+          "{'Q', TypedText} || Priority: 50 || Availability: Available || Brief comment: None"
         ]
         self.check_completion_results(cr, expected)
 

Modified: vendor/clang/dist-release_70/include/clang/AST/Decl.h
==============================================================================
--- vendor/clang/dist-release_70/include/clang/AST/Decl.h	Sun Nov  4 14:41:54 2018	(r340117)
+++ vendor/clang/dist-release_70/include/clang/AST/Decl.h	Sun Nov  4 14:42:02 2018	(r340118)
@@ -2269,8 +2269,7 @@ class FunctionDecl : public DeclaratorDecl, public Dec
   unsigned getMinRequiredArguments() const;
 
   QualType getReturnType() const {
-    assert(getType()->getAs<FunctionType>() && "Expected a FunctionType!");
-    return getType()->getAs<FunctionType>()->getReturnType();
+    return getType()->castAs<FunctionType>()->getReturnType();
   }
 
   /// Attempt to compute an informative source range covering the
@@ -2278,14 +2277,22 @@ class FunctionDecl : public DeclaratorDecl, public Dec
   /// limited representation in the AST.
   SourceRange getReturnTypeSourceRange() const;
 
+  /// Get the declared return type, which may differ from the actual return
+  /// type if the return type is deduced.
+  QualType getDeclaredReturnType() const {
+    auto *TSI = getTypeSourceInfo();
+    QualType T = TSI ? TSI->getType() : getType();
+    return T->castAs<FunctionType>()->getReturnType();
+  }
+
   /// Attempt to compute an informative source range covering the
   /// function exception specification, if any.
   SourceRange getExceptionSpecSourceRange() const;
 
   /// Determine the type of an expression that calls this function.
   QualType getCallResultType() const {
-    assert(getType()->getAs<FunctionType>() && "Expected a FunctionType!");
-    return getType()->getAs<FunctionType>()->getCallResultType(getASTContext());
+    return getType()->castAs<FunctionType>()->getCallResultType(
+        getASTContext());
   }
 
   /// Returns the WarnUnusedResultAttr that is either declared on this

Modified: vendor/clang/dist-release_70/include/clang/Driver/Options.td
==============================================================================
--- vendor/clang/dist-release_70/include/clang/Driver/Options.td	Sun Nov  4 14:41:54 2018	(r340117)
+++ vendor/clang/dist-release_70/include/clang/Driver/Options.td	Sun Nov  4 14:42:02 2018	(r340118)
@@ -802,7 +802,7 @@ def fconstexpr_backtrace_limit_EQ : Joined<["-"], "fco
                                     Group<f_Group>;
 def fno_crash_diagnostics : Flag<["-"], "fno-crash-diagnostics">, Group<f_clang_Group>, Flags<[NoArgumentUnused]>,
   HelpText<"Disable auto-generation of preprocessed source files and a script for reproduction during a clang crash">;
-def fcrash_diagnostics_dir : Joined<["-"], "fcrash-diagnostics-dir=">, Group<f_clang_Group>, Flags<[NoArgumentUnused]>;
+def fcrash_diagnostics_dir : Joined<["-"], "fcrash-diagnostics-dir=">, Group<f_clang_Group>, Flags<[NoArgumentUnused, CoreOption]>;
 def fcreate_profile : Flag<["-"], "fcreate-profile">, Group<f_Group>;
 def fcxx_exceptions: Flag<["-"], "fcxx-exceptions">, Group<f_Group>,
   HelpText<"Enable C++ exceptions">, Flags<[CC1Option]>;

Modified: vendor/clang/dist-release_70/include/clang/Sema/Sema.h
==============================================================================
--- vendor/clang/dist-release_70/include/clang/Sema/Sema.h	Sun Nov  4 14:41:54 2018	(r340117)
+++ vendor/clang/dist-release_70/include/clang/Sema/Sema.h	Sun Nov  4 14:42:02 2018	(r340118)
@@ -1950,6 +1950,8 @@ class Sema { (public)
                                 FunctionDecl *NewFD, LookupResult &Previous,
                                 bool IsMemberSpecialization);
   bool shouldLinkDependentDeclWithPrevious(Decl *D, Decl *OldDecl);
+  bool canFullyTypeCheckRedeclaration(ValueDecl *NewD, ValueDecl *OldD,
+                                      QualType NewT, QualType OldT);
   void CheckMain(FunctionDecl *FD, const DeclSpec &D);
   void CheckMSVCRTEntryPoint(FunctionDecl *FD);
   Attr *getImplicitCodeSegOrSectionAttrForFunction(const FunctionDecl *FD, bool IsDefinition);

Modified: vendor/clang/dist-release_70/lib/Basic/Version.cpp
==============================================================================
--- vendor/clang/dist-release_70/lib/Basic/Version.cpp	Sun Nov  4 14:41:54 2018	(r340117)
+++ vendor/clang/dist-release_70/lib/Basic/Version.cpp	Sun Nov  4 14:42:02 2018	(r340118)
@@ -36,7 +36,7 @@ std::string getClangRepositoryPath() {
 
   // If the SVN_REPOSITORY is empty, try to use the SVN keyword. This helps us
   // pick up a tag in an SVN export, for example.
-  StringRef SVNRepository("$URL: https://llvm.org/svn/llvm-project/cfe/tags/RELEASE_700/final/lib/Basic/Version.cpp $");
+  StringRef SVNRepository("$URL: https://llvm.org/svn/llvm-project/cfe/branches/release_70/lib/Basic/Version.cpp $");
   if (URL.empty()) {
     URL = SVNRepository.slice(SVNRepository.find(':'),
                               SVNRepository.find("/lib/Basic"));

Modified: vendor/clang/dist-release_70/lib/CodeGen/CGBuiltin.cpp
==============================================================================
--- vendor/clang/dist-release_70/lib/CodeGen/CGBuiltin.cpp	Sun Nov  4 14:41:54 2018	(r340117)
+++ vendor/clang/dist-release_70/lib/CodeGen/CGBuiltin.cpp	Sun Nov  4 14:42:02 2018	(r340118)
@@ -8952,9 +8952,9 @@ llvm::Value *CodeGenFunction::EmitX86CpuSupports(uint3
       Builder.CreateAlignedLoad(CpuFeatures, CharUnits::fromQuantity(4));
 
   // Check the value of the bit corresponding to the feature requested.
-  Value *Bitset = Builder.CreateAnd(
-      Features, llvm::ConstantInt::get(Int32Ty, FeaturesMask));
-  return Builder.CreateICmpNE(Bitset, llvm::ConstantInt::get(Int32Ty, 0));
+  Value *Mask = Builder.getInt32(FeaturesMask);
+  Value *Bitset = Builder.CreateAnd(Features, Mask);
+  return Builder.CreateICmpEQ(Bitset, Mask);
 }
 
 Value *CodeGenFunction::EmitX86CpuInit() {

Modified: vendor/clang/dist-release_70/lib/Driver/Driver.cpp
==============================================================================
--- vendor/clang/dist-release_70/lib/Driver/Driver.cpp	Sun Nov  4 14:41:54 2018	(r340117)
+++ vendor/clang/dist-release_70/lib/Driver/Driver.cpp	Sun Nov  4 14:42:02 2018	(r340118)
@@ -2998,9 +2998,10 @@ void Driver::BuildActions(Compilation &C, DerivedArgLi
     Args.eraseArg(options::OPT__SLASH_Yc);
     YcArg = nullptr;
   }
-  if (Args.hasArg(options::OPT__SLASH_Y_)) {
-    // /Y- disables all pch handling.  Rather than check for it everywhere,
-    // just remove clang-cl pch-related flags here.
+  if (FinalPhase == phases::Preprocess || Args.hasArg(options::OPT__SLASH_Y_)) {
+    // If only preprocessing or /Y- is used, all pch handling is disabled.
+    // Rather than check for it everywhere, just remove clang-cl pch-related
+    // flags here.
     Args.eraseArg(options::OPT__SLASH_Fp);
     Args.eraseArg(options::OPT__SLASH_Yc);
     Args.eraseArg(options::OPT__SLASH_Yu);

Modified: vendor/clang/dist-release_70/lib/Driver/ToolChains/Gnu.cpp
==============================================================================
--- vendor/clang/dist-release_70/lib/Driver/ToolChains/Gnu.cpp	Sun Nov  4 14:41:54 2018	(r340117)
+++ vendor/clang/dist-release_70/lib/Driver/ToolChains/Gnu.cpp	Sun Nov  4 14:42:02 2018	(r340118)
@@ -237,7 +237,7 @@ static const char *getLDMOption(const llvm::Triple &T,
   case llvm::Triple::aarch64:
     return "aarch64linux";
   case llvm::Triple::aarch64_be:
-    return "aarch64_be_linux";
+    return "aarch64linuxb";
   case llvm::Triple::arm:
   case llvm::Triple::thumb:
     return "armelf_linux_eabi";

Modified: vendor/clang/dist-release_70/lib/Sema/SemaDecl.cpp
==============================================================================
--- vendor/clang/dist-release_70/lib/Sema/SemaDecl.cpp	Sun Nov  4 14:41:54 2018	(r340117)
+++ vendor/clang/dist-release_70/lib/Sema/SemaDecl.cpp	Sun Nov  4 14:42:02 2018	(r340118)
@@ -3249,20 +3249,15 @@ bool Sema::MergeFunctionDecl(FunctionDecl *New, NamedD
     //   Redeclarations or specializations of a function or function template
     //   with a declared return type that uses a placeholder type shall also
     //   use that placeholder, not a deduced type.
-    QualType OldDeclaredReturnType =
-        (Old->getTypeSourceInfo()
-             ? Old->getTypeSourceInfo()->getType()->castAs<FunctionType>()
-             : OldType)->getReturnType();
-    QualType NewDeclaredReturnType =
-        (New->getTypeSourceInfo()
-             ? New->getTypeSourceInfo()->getType()->castAs<FunctionType>()
-             : NewType)->getReturnType();
+    QualType OldDeclaredReturnType = Old->getDeclaredReturnType();
+    QualType NewDeclaredReturnType = New->getDeclaredReturnType();
     if (!Context.hasSameType(OldDeclaredReturnType, NewDeclaredReturnType) &&
-        !((NewQType->isDependentType() || OldQType->isDependentType()) &&
-          New->isLocalExternDecl())) {
+        canFullyTypeCheckRedeclaration(New, Old, NewDeclaredReturnType,
+                                       OldDeclaredReturnType)) {
       QualType ResQT;
       if (NewDeclaredReturnType->isObjCObjectPointerType() &&
           OldDeclaredReturnType->isObjCObjectPointerType())
+        // FIXME: This does the wrong thing for a deduced return type.
         ResQT = Context.mergeObjCGCQualifiers(NewQType, OldQType);
       if (ResQT.isNull()) {
         if (New->isCXXClassMember() && New->isOutOfLine())
@@ -3427,13 +3422,11 @@ bool Sema::MergeFunctionDecl(FunctionDecl *New, NamedD
     if (OldQTypeForComparison == NewQType)
       return MergeCompatibleFunctionDecls(New, Old, S, MergeTypeWithOld);
 
-    if ((NewQType->isDependentType() || OldQType->isDependentType()) &&
-        New->isLocalExternDecl()) {
-      // It's OK if we couldn't merge types for a local function declaraton
-      // if either the old or new type is dependent. We'll merge the types
-      // when we instantiate the function.
+    // If the types are imprecise (due to dependent constructs in friends or
+    // local extern declarations), it's OK if they differ. We'll check again
+    // during instantiation.
+    if (!canFullyTypeCheckRedeclaration(New, Old, NewQType, OldQType))
       return false;
-    }
 
     // Fall through for conflicting redeclarations and redefinitions.
   }
@@ -9336,6 +9329,39 @@ Attr *Sema::getImplicitCodeSegOrSectionAttrForFunction
   }
   return nullptr;
 }
+
+/// Determines if we can perform a correct type check for \p D as a
+/// redeclaration of \p PrevDecl. If not, we can generally still perform a
+/// best-effort check.
+///
+/// \param NewD The new declaration.
+/// \param OldD The old declaration.
+/// \param NewT The portion of the type of the new declaration to check.
+/// \param OldT The portion of the type of the old declaration to check.
+bool Sema::canFullyTypeCheckRedeclaration(ValueDecl *NewD, ValueDecl *OldD,
+                                          QualType NewT, QualType OldT) {
+  if (!NewD->getLexicalDeclContext()->isDependentContext())
+    return true;
+
+  // For dependently-typed local extern declarations and friends, we can't
+  // perform a correct type check in general until instantiation:
+  //
+  //   int f();
+  //   template<typename T> void g() { T f(); }
+  //
+  // (valid if g() is only instantiated with T = int).
+  if (NewT->isDependentType() &&
+      (NewD->isLocalExternDecl() || NewD->getFriendObjectKind()))
+    return false;
+
+  // Similarly, if the previous declaration was a dependent local extern
+  // declaration, we don't really know its type yet.
+  if (OldT->isDependentType() && OldD->isLocalExternDecl())
+    return false;
+
+  return true;
+}
+
 /// Checks if the new declaration declared in dependent context must be
 /// put in the same redeclaration chain as the specified declaration.
 ///
@@ -9346,20 +9372,30 @@ Attr *Sema::getImplicitCodeSegOrSectionAttrForFunction
 ///          belongs to.
 ///
 bool Sema::shouldLinkDependentDeclWithPrevious(Decl *D, Decl *PrevDecl) {
-  // Any declarations should be put into redeclaration chains except for
-  // friend declaration in a dependent context that names a function in
-  // namespace scope.
+  if (!D->getLexicalDeclContext()->isDependentContext())
+    return true;
+
+  // Don't chain dependent friend function definitions until instantiation, to
+  // permit cases like
   //
-  // This allows to compile code like:
+  //   void func();
+  //   template<typename T> class C1 { friend void func() {} };
+  //   template<typename T> class C2 { friend void func() {} };
   //
-  //       void func();
-  //       template<typename T> class C1 { friend void func() { } };
-  //       template<typename T> class C2 { friend void func() { } };
+  // ... which is valid if only one of C1 and C2 is ever instantiated.
   //
-  // This code snippet is a valid code unless both templates are instantiated.
-  return !(D->getLexicalDeclContext()->isDependentContext() &&
-           D->getDeclContext()->isFileContext() &&
-           D->getFriendObjectKind() != Decl::FOK_None);
+  // FIXME: This need only apply to function definitions. For now, we proxy
+  // this by checking for a file-scope function. We do not want this to apply
+  // to friend declarations nominating member functions, because that gets in
+  // the way of access checks.
+  if (D->getFriendObjectKind() && D->getDeclContext()->isFileContext())
+    return false;
+
+  auto *VD = dyn_cast<ValueDecl>(D);
+  auto *PrevVD = dyn_cast<ValueDecl>(PrevDecl);
+  return !VD || !PrevVD ||
+         canFullyTypeCheckRedeclaration(VD, PrevVD, VD->getType(),
+                                        PrevVD->getType());
 }
 
 namespace MultiVersioning {

Modified: vendor/clang/dist-release_70/lib/Sema/SemaOverload.cpp
==============================================================================
--- vendor/clang/dist-release_70/lib/Sema/SemaOverload.cpp	Sun Nov  4 14:41:54 2018	(r340117)
+++ vendor/clang/dist-release_70/lib/Sema/SemaOverload.cpp	Sun Nov  4 14:42:02 2018	(r340118)
@@ -1105,7 +1105,8 @@ bool Sema::IsOverload(FunctionDecl *New, FunctionDecl 
       (!TemplateParameterListsAreEqual(NewTemplate->getTemplateParameters(),
                                        OldTemplate->getTemplateParameters(),
                                        false, TPL_TemplateMatch) ||
-       OldType->getReturnType() != NewType->getReturnType()))
+       !Context.hasSameType(Old->getDeclaredReturnType(),
+                            New->getDeclaredReturnType())))
     return true;
 
   // If the function is a class member, its signature includes the

Modified: vendor/clang/dist-release_70/lib/Sema/SemaTemplate.cpp
==============================================================================
--- vendor/clang/dist-release_70/lib/Sema/SemaTemplate.cpp	Sun Nov  4 14:41:54 2018	(r340117)
+++ vendor/clang/dist-release_70/lib/Sema/SemaTemplate.cpp	Sun Nov  4 14:42:02 2018	(r340118)
@@ -8304,6 +8304,8 @@ Sema::CheckMemberSpecialization(NamedDecl *Member, Loo
         QualType Adjusted = Function->getType();
         if (!hasExplicitCallingConv(Adjusted))
           Adjusted = adjustCCAndNoReturn(Adjusted, Method->getType());
+        // This doesn't handle deduced return types, but both function
+        // declarations should be undeduced at this point.
         if (Context.hasSameType(Adjusted, Method->getType())) {
           FoundInstantiation = *I;
           Instantiation = Method;

Modified: vendor/clang/dist-release_70/test/CodeGen/attr-target-mv.c
==============================================================================
--- vendor/clang/dist-release_70/test/CodeGen/attr-target-mv.c	Sun Nov  4 14:41:54 2018	(r340117)
+++ vendor/clang/dist-release_70/test/CodeGen/attr-target-mv.c	Sun Nov  4 14:42:02 2018	(r340118)
@@ -70,6 +70,22 @@ void bar4() {
 // CHECK: ret void ()* @foo_decls.sse4.2
 // CHECK: ret void ()* @foo_decls
 
+// CHECK: define void @bar4()
+// CHECK: call void @foo_multi.ifunc()
+
+// CHECK: define void ()* @foo_multi.resolver() comdat
+// CHECK: and i32 %{{.*}}, 4352
+// CHECK: icmp eq i32 %{{.*}}, 4352
+// CHECK: ret void ()* @foo_multi.fma4_sse4.2
+// CHECK: icmp eq i32 %{{.*}}, 12
+// CHECK: and i32 %{{.*}}, 4352
+// CHECK: icmp eq i32 %{{.*}}, 4352
+// CHECK: ret void ()* @foo_multi.arch_ivybridge_fma4_sse4.2
+// CHECK: and i32 %{{.*}}, 768
+// CHECK: icmp eq i32 %{{.*}}, 768
+// CHECK: ret void ()* @foo_multi.avx_sse4.2
+// CHECK: ret void ()* @foo_multi
+
 // CHECK: declare i32 @foo.arch_sandybridge()
 
 // CHECK: define available_externally i32 @foo_inline.sse4.2()
@@ -88,4 +104,3 @@ void bar4() {
 // CHECK: define available_externally void @foo_multi.avx_sse4.2()
 // CHECK: define available_externally void @foo_multi.fma4_sse4.2()
 // CHECK: define available_externally void @foo_multi.arch_ivybridge_fma4_sse4.2()
-

Modified: vendor/clang/dist-release_70/test/CodeGen/builtin-cpu-supports.c
==============================================================================
--- vendor/clang/dist-release_70/test/CodeGen/builtin-cpu-supports.c	Sun Nov  4 14:41:54 2018	(r340117)
+++ vendor/clang/dist-release_70/test/CodeGen/builtin-cpu-supports.c	Sun Nov  4 14:42:02 2018	(r340118)
@@ -14,7 +14,7 @@ int main() {
 
   // CHECK: [[LOAD:%[^ ]+]] = load i32, i32* getelementptr inbounds ({ i32, i32, i32, [1 x i32] }, { i32, i32, i32, [1 x i32] }* @__cpu_model, i32 0, i32 3, i32 0)
   // CHECK: [[AND:%[^ ]+]] = and i32 [[LOAD]], 256
-  // CHECK: = icmp ne i32 [[AND]], 0
+  // CHECK: = icmp eq i32 [[AND]], 256
 
   return 0;
 }

Modified: vendor/clang/dist-release_70/test/Driver/cl-options.c
==============================================================================
--- vendor/clang/dist-release_70/test/Driver/cl-options.c	Sun Nov  4 14:41:54 2018	(r340117)
+++ vendor/clang/dist-release_70/test/Driver/cl-options.c	Sun Nov  4 14:42:02 2018	(r340118)
@@ -566,6 +566,7 @@
 // RUN: %clang_cl \
 // RUN:     --driver-mode=cl \
 // RUN:     -fblocks \
+// RUN:     -fcrash-diagnostics-dir=/foo \
 // RUN:     -fno-blocks \
 // RUN:     -fbuiltin \
 // RUN:     -fno-builtin \

Modified: vendor/clang/dist-release_70/test/Driver/cl-pch.cpp
==============================================================================
--- vendor/clang/dist-release_70/test/Driver/cl-pch.cpp	Sun Nov  4 14:41:54 2018	(r340117)
+++ vendor/clang/dist-release_70/test/Driver/cl-pch.cpp	Sun Nov  4 14:42:02 2018	(r340118)
@@ -345,3 +345,24 @@
 // CHECK-NoSourceTP: pchfile.pch
 // CHECK-NoSourceTP: -x
 // CHECK-NoSourceTP: "c++"
+
+// If only preprocessing, PCH options are ignored.
+// RUN: %clang_cl /P /Ycpchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-YC-P %s
+// CHECK-YC-P-NOT: -emit-pch
+// CHECK-YC-P-NOT: -include-pch
+
+// RUN: %clang_cl /E /Ycpchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-YC-E %s
+// CHECK-YC-E-NOT: -emit-pch
+// CHECK-YC-E-NOT: -include-pch
+
+// RUN: %clang_cl /P /Ycpchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-YU-P %s
+// CHECK-YU-P-NOT: -emit-pch
+// CHECK-YU-P-NOT: -include-pch
+
+// RUN: %clang_cl /E /Ycpchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-YU-E %s
+// CHECK-YU-E-NOT: -emit-pch
+// CHECK-YU-E-NOT: -include-pch

Modified: vendor/clang/dist-release_70/test/Driver/linux-ld.c
==============================================================================
--- vendor/clang/dist-release_70/test/Driver/linux-ld.c	Sun Nov  4 14:41:54 2018	(r340117)
+++ vendor/clang/dist-release_70/test/Driver/linux-ld.c	Sun Nov  4 14:42:02 2018	(r340118)
@@ -1648,6 +1648,14 @@
 // CHECK-ARMV7EB: "--be8"
 // CHECK-ARMV7EB: "-m" "armelfb_linux_eabi"
 
+// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
+// RUN:     --target=aarch64_be-unknown-linux \
+// RUN:     --gcc-toolchain="" \
+// RUN:     --sysroot=%S/Inputs/basic_linux_tree \
+// RUN:   | FileCheck --check-prefix=CHECK-AARCH64BE %s
+// CHECK-AARCH64BE: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]"
+// CHECK-AARCH64BE: "-m" "aarch64linuxb"
+
 // Check dynamic-linker for musl-libc
 // RUN: %clang %s -### -o %t.o 2>&1 \
 // RUN:     --target=i386-pc-linux-musl \

Added: vendor/clang/dist-release_70/test/PCH/Inputs/pch-through-use3c.cpp
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ vendor/clang/dist-release_70/test/PCH/Inputs/pch-through-use3c.cpp	Sun Nov  4 14:42:02 2018	(r340118)
@@ -0,0 +1,2 @@
+int a = A;
+// expected-no-diagnostics

Added: vendor/clang/dist-release_70/test/PCH/Inputs/pch-through3c.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ vendor/clang/dist-release_70/test/PCH/Inputs/pch-through3c.h	Sun Nov  4 14:42:02 2018	(r340118)
@@ -0,0 +1 @@
+#define A 1

Added: vendor/clang/dist-release_70/test/PCH/pch-through3c.cpp
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ vendor/clang/dist-release_70/test/PCH/pch-through3c.cpp	Sun Nov  4 14:42:02 2018	(r340118)
@@ -0,0 +1,8 @@
+// RUN: %clang_cc1 -I %S -emit-pch \
+// RUN:   -include Inputs/pch-through3c.h \
+// RUN:   -pch-through-header=Inputs/pch-through3c.h -o %t.3c %s
+
+// RUN: %clang_cc1 -verify -I %S -include-pch %t.3c \
+// RUN:   -include Inputs/pch-through3c.h \
+// RUN:   -pch-through-header=Inputs/pch-through3c.h \
+// RUN:   %S/Inputs/pch-through-use3c.cpp 2>&1

Modified: vendor/clang/dist-release_70/test/SemaCXX/cxx1y-deduced-return-type.cpp
==============================================================================
--- vendor/clang/dist-release_70/test/SemaCXX/cxx1y-deduced-return-type.cpp	Sun Nov  4 14:41:54 2018	(r340117)
+++ vendor/clang/dist-release_70/test/SemaCXX/cxx1y-deduced-return-type.cpp	Sun Nov  4 14:42:02 2018	(r340118)
@@ -552,3 +552,73 @@ namespace PR24989 {
 void forinit_decltypeauto() {
   for (decltype(auto) forinit_decltypeauto_inner();;) {} // expected-warning {{interpreted as a function}} expected-note {{replace}}
 }
+
+namespace PR33222 {
+  auto f1();
+  auto f2();
+
+  template<typename T> decltype(auto) g0(T x) { return x.n; }
+  template<typename T> decltype(auto) g1(T);
+  template<typename T> decltype(auto) g2(T);
+
+  struct X {
+    static auto f1();
+    static auto f2();
+
+    template<typename T> static decltype(auto) g0(T x) { return x.n; } // FIXME (PR38883): expected-error {{private}}
+    template<typename T> static decltype(auto) g1(T);
+    template<typename T> static decltype(auto) g2(T);
+  };
+
+  template<typename U> class A {
+    friend auto f1();
+    friend auto f2();
+
+    // FIXME (PR38883): This friend declaration doesn't actually work, because
+    // we fail to look up the named function properly during instantiation.
+    friend decltype(auto) g0<>(A);
+    template<typename T> friend decltype(auto) g1(T);
+    template<typename T> friend decltype(auto) g2(T);
+
+    friend auto X::f1();
+    friend auto X::f2();
+
+    // FIXME (PR38882): 'A' names the class template not the injected-class-name here!
+    friend decltype(auto) X::g0<>(A<U>);
+    // FIXME (PR38882): ::T hides the template parameter if both are named T here!
+    template<typename T_> friend decltype(auto) X::g1(T_);
+    template<typename T_> friend decltype(auto) X::g2(T_);
+
+    int n; // FIXME: expected-note {{here}}
+  };
+
+  auto f1() { return A<int>().n; }
+  template<typename T> decltype(auto) g1(T x) { return A<int>().n; }
+
+  auto X::f1() { return A<int>().n; }
+  template<typename T> decltype(auto) X::g1(T x) { return A<int>().n; }
+
+  A<int> ai;
+  int k1 = g0(ai);
+  int k2 = X::g0(ai); // FIXME: expected-note {{in instantiation of}}
+
+  int k3 = g1(ai);
+  int k4 = X::g1(ai);
+
+  auto f2() { return A<int>().n; }
+  template<typename T> decltype(auto) g2(T x) { return A<int>().n; }
+
+  auto X::f2() { return A<int>().n; }
+  template<typename T> decltype(auto) X::g2(T x) { return A<int>().n; }
+
+  int k5 = g2(ai);
+  int k6 = X::g2(ai);
+
+  template<typename> struct B {
+    auto *q() { return (float*)0; } // expected-note 2{{previous}}
+  };
+  template<> auto *B<char[1]>::q() { return (int*)0; }
+  template<> auto B<char[2]>::q() { return (int*)0; } // expected-error {{return type}}
+  // FIXME: suppress this follow-on error: expected-error@-1 {{cannot initialize}}
+  template<> int B<char[3]>::q() { return 0; } // expected-error {{return type}}
+}

Modified: vendor/clang/dist-release_70/test/SemaCXX/friend.cpp
==============================================================================
--- vendor/clang/dist-release_70/test/SemaCXX/friend.cpp	Sun Nov  4 14:41:54 2018	(r340117)
+++ vendor/clang/dist-release_70/test/SemaCXX/friend.cpp	Sun Nov  4 14:42:02 2018	(r340118)
@@ -388,3 +388,26 @@ namespace default_arg {
     friend void f(void *p = 0) {} // expected-error {{must be the only}}
   };
 }
+
+namespace PR33222 {
+  int f();
+  template<typename T> struct X {
+    friend T f();
+  };
+  X<int> xi;
+
+  int g(); // expected-note {{previous}}
+  template<typename T> struct Y {
+    friend T g(); // expected-error {{return type}}
+  };
+  Y<float> yf; // expected-note {{instantiation}}
+
+  int h();
+  template<typename T> struct Z {
+    // FIXME: The note here should point at the non-friend declaration, not the
+    // instantiation in Z<int>.
+    friend T h(); // expected-error {{return type}} expected-note {{previous}}
+  };
+  Z<int> zi;
+  Z<float> zf; // expected-note {{instantiation}}
+}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201811041442.wA4Eg2wB060950>