diff options
| -rw-r--r-- | lib/AST/ASTContext.cpp | 3 | ||||
| -rw-r--r-- | lib/CodeGen/CodeGenFunction.cpp | 3 | ||||
| -rw-r--r-- | lib/Index/IndexDecl.cpp | 8 | ||||
| -rw-r--r-- | lib/Sema/SemaInit.cpp | 2 | ||||
| -rw-r--r-- | test/Index/Core/index-source.m | 12 | ||||
| -rw-r--r-- | test/Index/Core/index-subkinds.m | 12 | ||||
| -rw-r--r-- | test/Index/index-decls.m | 4 | ||||
| -rw-r--r-- | test/Index/index-module.m | 2 | ||||
| -rw-r--r-- | test/OpenMP/openmp_seh.c | 18 | ||||
| -rw-r--r-- | test/SemaCXX/constant-expression.cpp | 11 | ||||
| -rw-r--r-- | test/SemaCXX/new-delete-cxx0x.cpp | 4 | ||||
| -rw-r--r-- | tools/libclang/CXIndexDataConsumer.cpp | 7 | ||||
| -rw-r--r-- | tools/libclang/CXIndexDataConsumer.h | 2 | 
13 files changed, 63 insertions, 25 deletions
| diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index d03c22af5b29..b531a66dbab3 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -9025,7 +9025,8 @@ bool ASTContext::DeclMustBeEmitted(const Decl *D) {    // Variables that have initialization with side-effects are required.    if (VD->getInit() && VD->getInit()->HasSideEffects(*this) && -      !VD->evaluateValue()) +      // We can get a value-dependent initializer during error recovery. +      (VD->getInit()->isValueDependent() || !VD->evaluateValue()))      return true;    // Likewise, variables with tuple-like bindings are required if their diff --git a/lib/CodeGen/CodeGenFunction.cpp b/lib/CodeGen/CodeGenFunction.cpp index 137c69420ddf..e142a21b1e74 100644 --- a/lib/CodeGen/CodeGenFunction.cpp +++ b/lib/CodeGen/CodeGenFunction.cpp @@ -112,9 +112,8 @@ CodeGenFunction::~CodeGenFunction() {    if (FirstBlockInfo)      destroyBlockInfos(FirstBlockInfo); -  if (getLangOpts().OpenMP) { +  if (getLangOpts().OpenMP && CurFn)      CGM.getOpenMPRuntime().functionFinished(*this); -  }  }  CharUnits CodeGenFunction::getNaturalPointeeTypeAlignment(QualType T, diff --git a/lib/Index/IndexDecl.cpp b/lib/Index/IndexDecl.cpp index 7d60aad3895d..3b4f3f81399d 100644 --- a/lib/Index/IndexDecl.cpp +++ b/lib/Index/IndexDecl.cpp @@ -92,7 +92,13 @@ public:        Relations.emplace_back((unsigned)SymbolRole::RelationAccessorOf,                               AssociatedProp); -    if (!IndexCtx.handleDecl(D, (unsigned)SymbolRole::Dynamic, Relations)) +    // getLocation() returns beginning token of a method declaration, but for +    // indexing purposes we want to point to the base name. +    SourceLocation MethodLoc = D->getSelectorStartLoc(); +    if (MethodLoc.isInvalid()) +      MethodLoc = D->getLocation(); + +    if (!IndexCtx.handleDecl(D, MethodLoc, (unsigned)SymbolRole::Dynamic, Relations))        return false;      IndexCtx.indexTypeSourceInfo(D->getReturnTypeSourceInfo(), D);      bool hasIBActionAndFirst = D->hasAttr<IBActionAttr>(); diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index 45eff5ee6b62..b053c83c3f69 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -1684,7 +1684,7 @@ void InitListChecker::CheckArrayType(const InitializedEntity &Entity,      // If this is an incomplete array type, the actual type needs to      // be calculated here.      llvm::APSInt Zero(maxElements.getBitWidth(), maxElements.isUnsigned()); -    if (maxElements == Zero) { +    if (maxElements == Zero && !Entity.isVariableLengthArrayNew()) {        // Sizing an array implicitly to zero is not allowed by ISO C,        // but is supported by GNU.        SemaRef.Diag(IList->getLocStart(), diff --git a/test/Index/Core/index-source.m b/test/Index/Core/index-source.m index 3debcd262b24..880028df6310 100644 --- a/test/Index/Core/index-source.m +++ b/test/Index/Core/index-source.m @@ -3,10 +3,10 @@  @interface Base  // CHECK: [[@LINE-1]]:12 | class/ObjC | Base | c:objc(cs)Base | _OBJC_CLASS_$_Base | Decl | rel: 0  -(void)meth; -// CHECK: [[@LINE-1]]:1 | instance-method/ObjC | meth | c:objc(cs)Base(im)meth | -[Base meth] | Decl,Dyn,RelChild | rel: 1 +// CHECK: [[@LINE-1]]:8 | instance-method/ObjC | meth | c:objc(cs)Base(im)meth | -[Base meth] | Decl,Dyn,RelChild | rel: 1  // CHECK-NEXT: RelChild | Base | c:objc(cs)Base  +(Base*)class_meth; -// CHECK: [[@LINE-1]]:1 | class-method/ObjC | class_meth | c:objc(cs)Base(cm)class_meth | +[Base class_meth] | Decl,Dyn,RelChild | rel: 1 +// CHECK: [[@LINE-1]]:9 | class-method/ObjC | class_meth | c:objc(cs)Base(cm)class_meth | +[Base class_meth] | Decl,Dyn,RelChild | rel: 1  // CHECK: [[@LINE-2]]:3 | class/ObjC | Base | c:objc(cs)Base | _OBJC_CLASS_$_Base | Ref,RelCont | rel: 1  // CHECK-NEXT: RelCont | class_meth | c:objc(cs)Base(cm)class_meth @@ -92,7 +92,7 @@ extern int setjmp(jmp_buf);  @class I1;  @interface I1 -// CHECK: [[@LINE+1]]:1 | instance-method/ObjC | meth | c:objc(cs)I1(im)meth | -[I1 meth] | Decl,Dyn,RelChild | rel: 1 +// CHECK: [[@LINE+1]]:8 | instance-method/ObjC | meth | c:objc(cs)I1(im)meth | -[I1 meth] | Decl,Dyn,RelChild | rel: 1  -(void)meth;  @end @@ -117,7 +117,7 @@ extern int setjmp(jmp_buf);  // CHECK-NEXT: RelChild | I2 | c:objc(cs)I2  @synthesize prop = _prop; -// CHECK: [[@LINE+5]]:1 | instance-method(IB)/ObjC | doAction:foo: | c:objc(cs)I2(im)doAction:foo: | -[I2 doAction:foo:] | Def,Dyn,RelChild | rel: 1 +// CHECK: [[@LINE+5]]:12 | instance-method(IB)/ObjC | doAction:foo: | c:objc(cs)I2(im)doAction:foo: | -[I2 doAction:foo:] | Def,Dyn,RelChild | rel: 1  // CHECK-NEXT: RelChild | I2 | c:objc(cs)I2  // CHECK: [[@LINE+3]]:22 | class/ObjC | I1 | c:objc(cs)I1 | _OBJC_CLASS_$_I1 | Ref,RelCont,RelIBType | rel: 1  // CHECK-NEXT: RelCont,RelIBType | doAction:foo: | c:objc(cs)I2(im)doAction:foo: @@ -127,11 +127,11 @@ extern int setjmp(jmp_buf);  @interface I3  @property (readwrite) id prop; -// CHECK: [[@LINE+3]]:1 | instance-method/acc-get/ObjC | prop | c:objc(cs)I3(im)prop | -[I3 prop] | Decl,Dyn,RelChild,RelAcc | rel: 2 +// CHECK: [[@LINE+3]]:6 | instance-method/acc-get/ObjC | prop | c:objc(cs)I3(im)prop | -[I3 prop] | Decl,Dyn,RelChild,RelAcc | rel: 2  // CHECK-NEXT: RelChild | I3 | c:objc(cs)I3  // CHECK-NEXT: RelAcc | prop | c:objc(cs)I3(py)prop  -(id)prop; -// CHECK: [[@LINE+3]]:1 | instance-method/acc-set/ObjC | setProp: | c:objc(cs)I3(im)setProp: | -[I3 setProp:] | Decl,Dyn,RelChild,RelAcc | rel: 2 +// CHECK: [[@LINE+3]]:8 | instance-method/acc-set/ObjC | setProp: | c:objc(cs)I3(im)setProp: | -[I3 setProp:] | Decl,Dyn,RelChild,RelAcc | rel: 2  // CHECK-NEXT: RelChild | I3 | c:objc(cs)I3  // CHECK-NEXT: RelAcc | prop | c:objc(cs)I3(py)prop  -(void)setProp:(id)p; diff --git a/test/Index/Core/index-subkinds.m b/test/Index/Core/index-subkinds.m index 6783f6dde308..15d60b151896 100644 --- a/test/Index/Core/index-subkinds.m +++ b/test/Index/Core/index-subkinds.m @@ -9,11 +9,11 @@  @end  // CHECK: [[@LINE+1]]:17 | class(test)/ObjC | MyTestCase | c:objc(cs)MyTestCase | <no-cgname> | Def | rel: 0  @implementation MyTestCase -// CHECK: [[@LINE+1]]:1 | instance-method(test)/ObjC | testMe | c:objc(cs)MyTestCase(im)testMe | -[MyTestCase testMe] | Def,Dyn,RelChild | rel: 1 +// CHECK: [[@LINE+1]]:8 | instance-method(test)/ObjC | testMe | c:objc(cs)MyTestCase(im)testMe | -[MyTestCase testMe] | Def,Dyn,RelChild | rel: 1  -(void)testMe {} -// CHECK: [[@LINE+1]]:1 | instance-method/ObjC | testResult | c:objc(cs)MyTestCase(im)testResult | -[MyTestCase testResult] | Def,Dyn,RelChild | rel: 1 +// CHECK: [[@LINE+1]]:6 | instance-method/ObjC | testResult | c:objc(cs)MyTestCase(im)testResult | -[MyTestCase testResult] | Def,Dyn,RelChild | rel: 1  -(id)testResult { return 0; } -// CHECK: [[@LINE+1]]:1 | instance-method/ObjC | testWithInt: | c:objc(cs)MyTestCase(im)testWithInt: | -[MyTestCase testWithInt:] | Def,Dyn,RelChild | rel: 1 +// CHECK: [[@LINE+1]]:8 | instance-method/ObjC | testWithInt: | c:objc(cs)MyTestCase(im)testWithInt: | -[MyTestCase testWithInt:] | Def,Dyn,RelChild | rel: 1  -(void)testWithInt:(int)i {}  @end @@ -22,7 +22,7 @@  @end  // CHECK: [[@LINE+1]]:17 | class(test)/ObjC | SubTestCase | c:objc(cs)SubTestCase | <no-cgname> | Def | rel: 0  @implementation SubTestCase -// CHECK: [[@LINE+1]]:1 | instance-method(test)/ObjC | testIt2 | c:objc(cs)SubTestCase(im)testIt2 | -[SubTestCase testIt2] | Def,Dyn,RelChild | rel: 1 +// CHECK: [[@LINE+1]]:8 | instance-method(test)/ObjC | testIt2 | c:objc(cs)SubTestCase(im)testIt2 | -[SubTestCase testIt2] | Def,Dyn,RelChild | rel: 1  -(void)testIt2 {}  @end @@ -34,7 +34,7 @@  // CHECK: [[@LINE+2]]:17 | class(test)/ObjC | MyTestCase | c:objc(cs)MyTestCase | _OBJC_CLASS_$_MyTestCase | Ref,RelCont | rel: 1  // CHECK: [[@LINE+1]]:28 | extension/ObjC | MyTestCase | c:objc(cy)MyTestCase@cat | <no-cgname> | Def | rel: 0  @implementation MyTestCase(cat) -// CHECK: [[@LINE+1]]:1 | instance-method(test)/ObjC | testInCat | c:objc(cs)MyTestCase(im)testInCat | -[MyTestCase(cat) testInCat] | Def,Dyn,RelChild | rel: 1 +// CHECK: [[@LINE+1]]:9 | instance-method(test)/ObjC | testInCat | c:objc(cs)MyTestCase(im)testInCat | -[MyTestCase(cat) testInCat] | Def,Dyn,RelChild | rel: 1  - (void)testInCat {}  @end @@ -47,7 +47,7 @@  @property (readonly) IBOutlet id prop;  // CHECK: [[@LINE+1]]:54 | instance-property(IB,IBColl)/ObjC | propColl | c:objc(cs)IBCls(py)propColl | <no-cgname> | Decl,RelChild | rel: 1  @property (readonly) IBOutletCollection(NSButton) id propColl; -// CHECK: [[@LINE+1]]:1 | instance-method(IB)/ObjC | doIt | c:objc(cs)IBCls(im)doIt | -[IBCls doIt] | Decl,Dyn,RelChild | rel: 1 +// CHECK: [[@LINE+1]]:12 | instance-method(IB)/ObjC | doIt | c:objc(cs)IBCls(im)doIt | -[IBCls doIt] | Decl,Dyn,RelChild | rel: 1  -(IBAction)doIt;  @end diff --git a/test/Index/index-decls.m b/test/Index/index-decls.m index a39d9e3bfa6b..7f7f11576ab8 100644 --- a/test/Index/index-decls.m +++ b/test/Index/index-decls.m @@ -58,7 +58,7 @@ int test1() {  // RUN: c-index-test -index-file %s -target x86_64-apple-macosx10.7 > %t  // RUN: FileCheck %s -input-file=%t  // CHECK: [indexDeclaration]: kind: objc-class | name: I | {{.*}} | loc: 1:12 -// CHECK: [indexDeclaration]: kind: objc-instance-method | name: prop | {{.*}} | loc: 3:2 +// CHECK: [indexDeclaration]: kind: objc-instance-method | name: prop | {{.*}} | loc: 3:7  // CHECK: [indexDeclaration]: kind: objc-property | name: prop | {{.*}} | loc: 2:25  // CHECK: [indexDeclaration]: kind: objc-category | name:  | {{.*}} | loc: 6:12  // CHECK: [indexDeclaration]: kind: objc-instance-method | name: setProp: | {{.*}} | loc: 7:33 @@ -82,5 +82,5 @@ int test1() {  // CHECK-NOT: [indexDeclaration]: kind: objc-instance-method {{.*}} loc: 37:  // CHECK-NOT: [indexDeclaration]: kind: objc-instance-method {{.*}} loc: 43: -// CHECK: [indexDeclaration]: kind: objc-instance-method | name: meth | {{.*}} loc: 54:1 | {{.*}} | isRedecl: 0 | isDef: 0 | +// CHECK: [indexDeclaration]: kind: objc-instance-method | name: meth | {{.*}} loc: 54:8 | {{.*}} | isRedecl: 0 | isDef: 0 |  // CHECK: [indexDeclaration]: kind: objc-property | name: c | USR: c:objc(cs)I5(cpy)c | lang: ObjC | cursor: ObjCPropertyDecl=c:55:23 [class,] | loc: 55:23 diff --git a/test/Index/index-module.m b/test/Index/index-module.m index d1c0b36b389e..51faea2d32bb 100644 --- a/test/Index/index-module.m +++ b/test/Index/index-module.m @@ -52,7 +52,7 @@ int glob;  // CHECK-TMOD-NEXT: [indexDeclaration]: kind: objc-class | name: Module | {{.*}} | loc: [[TMOD_MODULE_H]]:15:12  // CHECK-TMOD-NEXT:      <ObjCContainerInfo>: kind: interface  // CHECK-TMOD-NEXT: [indexDeclaration]: kind: objc-class-method | name: version | {{.*}} | loc: [[TMOD_MODULE_H]]:16:1 -// CHECK-TMOD-NEXT: [indexDeclaration]: kind: objc-class-method | name: alloc | {{.*}} | loc: [[TMOD_MODULE_H]]:17:1 +// CHECK-TMOD-NEXT: [indexDeclaration]: kind: objc-class-method | name: alloc | {{.*}} | loc: [[TMOD_MODULE_H]]:17:2  // CHECK-TMOD-NEXT: [indexDeclaration]: kind: typedef | name: FILE | {{.*}} | loc: [[TMOD_MODULE_H]]:30:3  // CHECK-TMOD-NEXT: [indexDeclaration]: kind: struct | name: __sFILE | {{.*}} | loc: [[TMOD_MODULE_H]]:28:16  // CHECK-TMOD-NEXT: [indexDeclaration]: kind: field | name: _offset | {{.*}} | loc: [[TMOD_MODULE_H]]:29:7 diff --git a/test/OpenMP/openmp_seh.c b/test/OpenMP/openmp_seh.c new file mode 100644 index 000000000000..74dccec125e3 --- /dev/null +++ b/test/OpenMP/openmp_seh.c @@ -0,0 +1,18 @@ +// RUN: %clang_cc1 -verify -triple x86_64-pc-windows-msvc19.0.0 -fopenmp -fms-compatibility -x c++ -emit-llvm %s -o - | FileCheck %s +// expected-no-diagnostics +// REQUIRES: x86-registered-target +extern "C" { +void __cpuid(int[4], int); +} + +// CHECK-LABEL: @main +int main(void) { +  __try { +    int info[4]; +    __cpuid(info, 1); +  } __except (1) { +  } + +  return 0; +} + diff --git a/test/SemaCXX/constant-expression.cpp b/test/SemaCXX/constant-expression.cpp index f82a69209379..69e846bf0ec2 100644 --- a/test/SemaCXX/constant-expression.cpp +++ b/test/SemaCXX/constant-expression.cpp @@ -143,3 +143,14 @@ namespace rdar16064952 {  }  char PR17381_ice = 1000000 * 1000000; // expected-warning {{overflow}} expected-warning {{changes value}} + +namespace PR31701 { +  struct C { +    template<int i> static int n; // expected-warning {{extension}} +  }; +  template <int M> class D; +  template <int M> +  template<int i> void D<M>::set() { // expected-error {{from class 'D<M>' without definition}} +    const C c = C::n<i>; +  } +} diff --git a/test/SemaCXX/new-delete-cxx0x.cpp b/test/SemaCXX/new-delete-cxx0x.cpp index c55152510e1b..4ef586f2e565 100644 --- a/test/SemaCXX/new-delete-cxx0x.cpp +++ b/test/SemaCXX/new-delete-cxx0x.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++11 -triple=i686-pc-linux-gnu +// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++11 -triple=i686-pc-linux-gnu -pedantic  void ugly_news(int *ip) {    (void)new int[-1]; // expected-error {{array size is negative}} @@ -29,6 +29,7 @@ void fn(int n) {    (void) new int[2] {1, 2};    (void) new S[2] {1, 2};    (void) new S[3] {1, 2}; +  (void) new S[n] {};    // C++11 [expr.new]p19:    //   If the new-expression creates an object or an array of objects of class    //   type, access and ambiguity control are done for the allocation function, @@ -44,6 +45,7 @@ void fn(int n) {    (void) new T[2] {1, 2}; // ok    (void) new T[3] {1, 2}; // expected-error {{no matching constructor}} expected-note {{in implicit initialization of array element 2}}    (void) new T[n] {1, 2}; // expected-error {{no matching constructor}} expected-note {{in implicit initialization of trailing array elements in runtime-sized array new}} +  (void) new T[n] {}; // expected-error {{no matching constructor}} expected-note {{in implicit initialization of trailing array elements in runtime-sized array new}}  }  struct U { diff --git a/tools/libclang/CXIndexDataConsumer.cpp b/tools/libclang/CXIndexDataConsumer.cpp index 1981cabbbe4c..cb8aebfd0c48 100644 --- a/tools/libclang/CXIndexDataConsumer.cpp +++ b/tools/libclang/CXIndexDataConsumer.cpp @@ -95,7 +95,7 @@ public:      if (isa<ObjCImplDecl>(LexicalDC) && !D->isThisDeclarationADefinition())        DataConsumer.handleSynthesizedObjCMethod(D, DeclLoc, LexicalDC);      else -      DataConsumer.handleObjCMethod(D); +      DataConsumer.handleObjCMethod(D, DeclLoc);      return true;    } @@ -801,7 +801,8 @@ bool CXIndexDataConsumer::handleObjCCategoryImpl(const ObjCCategoryImplDecl *D)    return handleObjCContainer(D, CategoryLoc, getCursor(D), CatDInfo);  } -bool CXIndexDataConsumer::handleObjCMethod(const ObjCMethodDecl *D) { +bool CXIndexDataConsumer::handleObjCMethod(const ObjCMethodDecl *D, +                                           SourceLocation Loc) {    bool isDef = D->isThisDeclarationADefinition();    bool isContainer = isDef;    bool isSkipped = false; @@ -814,7 +815,7 @@ bool CXIndexDataConsumer::handleObjCMethod(const ObjCMethodDecl *D) {    DeclInfo DInfo(!D->isCanonicalDecl(), isDef, isContainer);    if (isSkipped)      DInfo.flags |= CXIdxDeclFlag_Skipped; -  return handleDecl(D, D->getLocation(), getCursor(D), DInfo); +  return handleDecl(D, Loc, getCursor(D), DInfo);  }  bool CXIndexDataConsumer::handleSynthesizedObjCProperty( diff --git a/tools/libclang/CXIndexDataConsumer.h b/tools/libclang/CXIndexDataConsumer.h index 718a2a18b1b3..16162cb83f77 100644 --- a/tools/libclang/CXIndexDataConsumer.h +++ b/tools/libclang/CXIndexDataConsumer.h @@ -418,7 +418,7 @@ public:    bool handleObjCCategory(const ObjCCategoryDecl *D);    bool handleObjCCategoryImpl(const ObjCCategoryImplDecl *D); -  bool handleObjCMethod(const ObjCMethodDecl *D); +  bool handleObjCMethod(const ObjCMethodDecl *D, SourceLocation Loc);    bool handleSynthesizedObjCProperty(const ObjCPropertyImplDecl *D);    bool handleSynthesizedObjCMethod(const ObjCMethodDecl *D, SourceLocation Loc, | 
